假设我安装了Oracle JDK 11(只是为了让事情变得更简单(。然后我下载了Gloon的JavaFX11,并在JDK上进行了解压。实际上,我在哪里解压JavaFX并不重要(因为我的下一个目标是基于OpenJRE制作自己的JRE安装程序(。然后我尝试启动应用程序:
c:Program FilesMyApp>"c:Program FilesJavajre-11binjava"
--module-path="c:Program FilesJavajre-11lib"
--add-modules=javafx.controls
--add-modules=javafx.base -jar ./MyApp.jar
我得到了这个:
启动层初始化过程中发生错误java.lang.LayerInstantiationException:模块java.base和模块jrt.fs中的包jdk.internal.jrfs
如果我试图删除"jrs.fs",那么我的应用程序就会崩溃,因为与类加载器相关的一些重要系统类丢失了。用Java 11启动JavaFX应用程序的正确方法是什么?现在,我是否需要每次对每个应用程序重新分发JavaFX(因为现在必须在启动应用程序的命令行中指定它的位置(。
我发现,当从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模块(加上添加模块中的任何东西(,那么问题就会更少
java -cp .;.lib --module-path .modules;. --add-modules javafx.controls,javafx.graphics,javafx.fxml,javafx.web,javafx.swing -jar MyApp.jar