如何使用Java11启动JavaFX应用程序?
比方说我安装了OracleJDK11(只是为了让事情更简单)。然后我下载了Gluon的JavaFX11,并在JDK上解包。实际上,我在哪里解包JavaFX并不重要(因为我的下一个目标是基于OpenJRE制作我自己的JRE安装程序)。 然后我尝试启动应用程序:如何使用Java11启动JavaFX应用程序?,java,javafx,java-11,javafx-11,Java,Javafx,Java 11,Javafx 11,比方说我安装了OracleJDK11(只是为了让事情更简单)。然后我下载了Gluon的JavaFX11,并在JDK上解包。实际上,我在哪里解包JavaFX并不重要(因为我的下一个目标是基于OpenJRE制作我自己的JRE安装程序)。 然后我尝试启动应用程序: c:\Program Files\MyApp>"c:\Program Files\Java\jre-11\bin\java" --module-path="c:\Progr
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”,那么我的应用程序就会崩溃,因为与类装入器相关的一些重要系统类丢失了。
用Java11启动JavaFX应用程序的正确方法是什么?
现在,我是否需要在每次应用程序中都重新分发JavaFX(因为现在必须在启动应用程序的命令行中指定它的位置)。我发现,当从Java 8转换到Java 11时,您可以将OpenJfx作为依赖项添加到Maven下(假设您使用的是Maven)。 乙二醇 其中Java11位于路径中,所有Maven依赖项(模块化或其他)都位于
lib
子目录中。必须将模块依赖项添加到添加模块
列表中
我随后发现,如果将模块放在另一个目录中,例如javafx模块(加上add模块中的任何内容),问题就会少一些
jre-11\lib
是否包含JavaFXSDK JAR?是否还包含可能不应作为模块路径一部分的其他JAR?。您是否尝试过在一个文件夹中单独使用JavaFXSDK JAR?您检查了吗?我不确定您的问题,但是如果您已经添加了javafx.controls
,则不需要通过--添加模块来添加javafx.base
。javafx.controls
模块将同时拉入javafx.base
和javafx.graphics
模块。模块jrt.fs
在哪里导致模块路径,如果不存在,则缺少哪些类?Jose,是的,它包含所有JAR。如果路径上有几个相同的模块,那么将jar移动到不同的文件夹会有什么帮助?nullpointer,jrt.fs位于modulepath中的JDK的lib文件夹中。很难说缺少了哪些类,因为它们似乎很多——类装入器就是不工作。我将花一些时间来理解所有的依赖关系。
<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 -cp .;.\lib --module-path .\modules;. --add-modules javafx.controls,javafx.graphics,javafx.fxml,javafx.web,javafx.swing -jar MyApp.jar