4

假设我安装了 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: Package jdk.internal.jrtfs 在模块 java.base 和模块 jrt.fs 中

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

4

1 回答 1

1

我发现从 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 在路径中,所有 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
于 2018-11-18T00:18:08.347 回答