首页 文章

如何使用Java 11启动JavaFX应用程序?

提问于
浏览
2

假设我安装了Oracle JDK 11(只是为了让事情更简单) . 然后我下载了Gluon的JavaFX 11并在JDK上解压缩 . 实际上我解压JavaFX并不重要(因为我的下一个目标是基于OpenJRE创建自己的JRE安装程序) . 然后我试图启动应用程序:

c:\Program Files\MyApp>"c:\Program Files\Java\jre-11\bin\java" 
                              --module-path="c:\Program Files\Java\jre-11\lib" 
                              --add-modules=javafx.controls 
                              --add-modules=javafx.base -jar ./MyApp.jar

我明白了:

在初始化引导层java.lang.LayerInstantiationException期间发生错误:在模块java.base和模块jrt.fs中打包jdk.internal.jrtfs

我尝试删除“jrs.fs”,然后我的应用程序崩溃,因为缺少与类加载器相关的一些重要系统类 . 使用Java 11启动JavaFX应用程序的正确方法是什么?我是否需要每次都使用每个应用程序重新分配JavaFX(因为现在必须在启动应用程序的命令行中指定它的位置) .

1 回答

  • 0

    我发现在从Java 8转换到Java 11时,您可以在Maven下添加OpenJfx作为依赖项(假设您使用的是Maven) . 例如

    <dependency>
      <groupId>org.openjfx</groupId>
      <artifactId>javafx-controls</artifactId>
      <version>11.0.1-ea+1</version>
    </dependency> etc
    

    然后你就可以跑了

    java  -cp .;.\lib --module-path .\lib;. --add-modules javafx.controls,javafx.graphics,javafx.fxml,javafx.web,javafx.swing -jar MyApp.jar
    

    其中Java 11位于Path中,并且所有Maven依赖项(模块化或其他)都位于 lib 子目录中 . 必须将模块依赖项添加到 add-modules 列表中 .

    我后来发现,如果将模块放在另一个目录中,例如javafx模块(加上add-modules中的任何内容),你会遇到的问题更少

    java  -cp .;.\lib --module-path .\modules;. --add-modules javafx.controls,javafx.graphics,javafx.fxml,javafx.web,javafx.swing -jar MyApp.jar
    

相关问题