假设我安装了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(因为现在必须在启动该应用程序的命令行中指定其位置)。
答案 0 :(得分:0)
我发现,当从Java 8转换为Java 11时,只需将OpenJfx添加为Maven下的依赖项(假设您正在使用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