Java 9 JavaFX 预加载器

Java 9 JavaFX Preloader

在 Java 8 中,我可以使用以下方法启动带有预加载器的 JavaFX 应用程序:

LauncherImpl.launchApplication(WindowMain.class, WindowMainPreloader.class, 
new String[]{...});

我更喜欢像上面那样从代码启动它,而不是使用部署配置,因为我不希望图形界面在我每次启动应用程序时都启动,但只有在一些代码计算出它之后才启动应用程序应该 运行 在 GUI 模式下。

我使用的是 class "com.sun.javafx.application.LauncherImpl",但显然在 Java 9 中所有以 "com.sun" 开头的 class 都被删除了。那么,如何在 Java 9 中使用预加载器启动应用程序?

本题答案有评论:

system property javafx.preloader=classname seems to work too.

我没试过,但也许你可以尝试设置 属性 并通过 public Application.launch(appClass, args) API 启动你的主应用程序,也许预加载器将首先启动。

查看 Application.launch 的代码,这似乎可行。这是最终调用的代码,从 Java 8 来源复制:

public static void launchApplication(final Class<? extends Application> appClass,
        final String[] args) {

    Class<? extends Preloader> preloaderClass = savedPreloaderClass;

    if (preloaderClass == null) {
        String preloaderByProperty = AccessController.doPrivileged((PrivilegedAction<String>) () ->
                System.getProperty("javafx.preloader"));
        if (preloaderByProperty != null) {
            try {
                preloaderClass = (Class<? extends Preloader>) Class.forName(preloaderByProperty,
                        false, appClass.getClassLoader());
            } catch (Exception e) {
                System.err.printf("Could not load preloader class '" + preloaderByProperty +
                        "', continuing without preloader.");
                e.printStackTrace();
            }
        }
    }

    launchApplication(appClass, preloaderClass, args);
}

因此您应该能够使用预加载器启动应用:

System.setProperty("javafx.preloader", "my fully qualified preloader class name");
Application.launch(myMainClass, args);

来自jdk 9,LauncherImpl 不工作jdk 10 - java.graphics module-info.java

com.sun.javafx.application 中的所有 类 导出到特殊模块 (java.base,javafx.controls,javafx.deploy,javafx.swing,javafx.web)

因此,如果您在模块中添加模块 (javafx.graphics),它就不起作用,

所以使用 : System.setProperty("javafx.preloader",path_class_loader) 作为 LauncherImpl 的替代 jkd 9 及以上

JDK 8:

LauncherImpl.launchApplication(Main.class, Preloader.class, arguments);

JDK 9:

System.setProperty("javafx.preloader", Preloader.class.getCanonicalName());
    Application.launch(Main.class, arguments);