【发布时间】:2014-11-05 12:36:30
【问题描述】:
以下场景:
JavaFxMainApp JavaFXUpdaterApp
两者都是带有 GUI 和 void main() 方法的 JavaFX 应用程序。
更新程序必须能够通过访问来启动 JavaFXMainApp JavaFxMainApp.jar 只知道主类-> 它只能!称呼 main().
JavaFxMainApp 还必须能够独立运行,方法是启动 main().
我无法启动多个 VMS,并且这两个应用程序无法通信。
这个问题是:
Application.launch() 每个 JVM 只能执行一次。
启动应用的标准 javaFx 方式:
Updater + MainApp
public static void main(String[] args) {
launch(args);
}
这里不可能满足要求 1)。由于两个 main() 方法都调用了 launch()。
我发现的第二种方法是:
Updater + MainApp
public static void main(String[] args) {
Application app2 = JavaFxMainApp.class.newInstance();
Stage anotherStage = new Stage();
app2.start(anotherStage);
}
首先,我失去了传递参数的可能性,但我可以忍受,因为无论如何它们都不会被使用。 这里的主要问题是,该代码仅在 JVM 已经运行 JavaFx 线程时才有效,因此它要求之前在 JVM 中调用了 launch()。情况并非如此,因为这两个调用都不再调用 launch()。
混合方法:
Updater calls launch(), MainApp takes the second approach
无法满足要求 2),因为现在无法在没有启动器更新程序的情况下启动 MainApp。
我的另一个想法是“尝试启动()catch()->在两个应用程序中尝试第二种方法(),但这会将两个应用程序结合起来并降低设置的灵活性。
有没有一种方法可以实现这一点,而不必重写 JavaFxs 的 LauncherImpl 或 Application 类来满足这些需求?
【问题讨论】:
-
为什么更新程序只能调用
main(...)?另外,您能否澄清一下更新程序在什么情况下“调用”主应用程序?更新程序是否已经在运行(作为 GUI 应用程序)?用例不是很清楚。 -
更新程序只能调用 main,因为它必须能够管理任何 Java 应用程序而无需进行调整。这样它就可以启动任何具有 main() 方法的 java 应用程序。更新程序搜索新版本并可以在线程中启动 MainApp。原因和规范是多个无聊的页面,恐怕不是我的发布。不是我的想法,但我将不得不接受所做的决定:/
-
这些要求确实与 JavaFX 的设计方式不一致。例如,在 Java 8 中,JavaFX 应用程序甚至根本不需要
main方法 - 因此在 Java 8 中,所有 Java 应用程序都具有main方法的规则存在例外情况。 -
添加了建议的 hack。