【发布时间】:2018-10-29 03:52:34
【问题描述】:
我正在为我们的旗舰应用程序(工作中)编写一个使用 JavaFX 的插件工具。旗舰应用有一个使用 Swing 的 Java 客户端,它允许用户执行用 Java 编写的宏,或安装用 Java 编写的插件。
注意,这些宏/插件可以自行运行,不依赖于 Java 客户端,因此无需将 JavaFX 组件放入 JFXPanel。
我们遇到的问题之一是调试方便。我们运行使用 JavaFX 的宏或插件,在我们杀死它之后(使用 stop() 和 Platform.exit() ),我们必须完全重新启动 Flagship App Java 客户端(即 JVM),然后才能重新运行JavaFX 宏/插件,由于整个“应用程序启动不能被多次调用”错误。旗舰应用加载相对较快,但仍需要一两分钟才能完全加载并打开一个新文件(没有打开文件就无法运行宏或插件)。
所以我看到了一些建议 place subsequent calls 到 Application.launch() into a runLater call,或者使用 Executor service,但这些似乎都没有真正满足我的需要,因为平台线程似乎被杀死了(JavaFX GUI 正确关闭,线程从正在运行的线程列表中消失)。就好像 JVM 有一个布尔值,当您调用 Application.launch() 时将其设置为 true,因此您无法在不杀死 JVM 的情况下重新启动 JavaFX 应用程序。
我需要能够在同一个 JVM 上多次运行 JavaFX 应用程序。那么有可能做到吗?
【问题讨论】:
-
我认为这是一些代码示例可以提供帮助的地方之一。另外:当您在此处阅读已经相关的内容时,请考虑提供一个链接以供参考(这样人们就不会告诉您您已经知道的事情)。
-
不知道我能提供什么样的代码是新颖和有启发性的。我重写了 Application stop() 方法并将 Platform.exit() 放在那里。使用调试器单步执行代码显示我正在按预期执行 stop() 方法(和 Platform.exit())。我看看能不能找到我读过的其他文章的链接。
-
代码可以围绕minimal reproducible example 框起来。重点是:15行代码让读者解读和推测的可能性为零。但是当你解释你的代码应该做什么时,我们不能 100 确定它在做什么。但是,您已经走上了一条好路,这是一个有趣的话题。
-
我真的不认为有一个简单的解决方法。 JavaFX 被设计为具有这样的应用程序生命周期——其中只有一个 JavaFX 应用程序实例在单个 JVM 实例中运行,并且基于该单个应用程序初始化和清理底层低级库。一旦您的应用程序停止,清理代码就会运行,即使您使用反射绕过限制,您也可能永远无法再次获得稳定状态。
-
以为我有一个想法,即为每个应用程序实例使用不同的
ModuleLayers,但第二次启动最终抛出了UnsatisfiedLinkError。因此,除非我做错了什么,否则甚至不可能(无论如何)在同一个 JVM 中多次启动 JavaFX。
标签: java javafx java-threads