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

时间:2018-11-06 23:12:49

标签: java javafx java-11 javafx-11

假设我安装了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 :(得分: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