如何使用JDK 11打开JavaFX .jar文件?

时间:2018-11-29 07:00:50

标签: java javafx java-11 openjfx

我在IntelliJ中创建了一个JavaFX项目。 我可以在IntelliJ中运行项目。我在配置中添加了以下代码):

--module-path ${PATH_TO_FX} --add-modules=javafx.controls,javafx.fxml

但是项目(由Artifects制成)的输出.jar文件未运行。我测试了这些命令,但没有任何机会:

java  --module-path %PATH_TO_FX% --add-modules javafx.controls,javafx.fxml -jar Timer.jar
java  --module-path %PATH_TO_FX% --add-modules javafx.controls  Timer.jar

命令行的最后错误日志:

Error: Could not find or load main class Files\Java\javafx-sdk-11.0.1\lib
Caused by: java.lang.ClassNotFoundException: Files\Java\javafx-sdk-11.0.1\lib

p.s:在JDK-10上构建时,我可以运行该项目的.jar文件

编辑

我下载了JavaFX,并将它的lib文件夹添加到系统环境中。 将JavaFX添加到项目中的过程如下: 项目结构>库>添加> Java> JavaFxPath / lib

然后我在此过程中为输出jar文件创建了Artifect: 项目结构> Artifects>添加> JAR>来自具有依赖性的模块> main类:main.Main。

4 个答案:

答案 0 :(得分:7)

假设您有一个简单的(非模块化)JavaFX 11项目(没有Maven / Gradle构建工具),并且您正在使用IntelliJ,就像here中的HelloFX示例一样,  这就是您可以从IntelliJ创建可以从控制台运行的jar的方法

可以找到关于如何运行项目的完整教程here,有关如何创建jar的说明则是here(请参阅非模块化项目部分),但是这些并不涵盖Artifacts来自IntelliJ。

使用以下VM选项检查HelloFX项目是否从IntelliJ运行:

--module-path ${PATH_TO_FX} --add-modules javafx.controls,javafx.fxml

PATH_TO_FX中设置了File -> Settings -> Appearance & Behavior -> Path Variables,指向JavaFX SDK库。

胖子罐

我们可以创建一个Jar,它只包含项目中的类和第三方依赖项,而不能包含JavaFX的类。

转到File -> Project Structure -> Artifacts -> Add -> JAR -> From modules with dependencies,添加主类,接受。

然后从列表中删除JavaFX jars ,并接受。

SemiJar

构建项目,它将创建一个很小的jar(在这种情况下为3 KB)。

现在您应该可以像这样运行它了

java --module-path %PATH_TO_FX% --add-modules javafx.controls,javafx.fxml -jar out\artifacts\HelloFX_jar\HelloFX.jar

(请确保%PATH_TO_FX%指向有效的文件夹,并在包含空格的情况下使用引号。

您可以分发此jar,并在其他平台上运行它,只要它们也具有JavaFX SDK。

胖罐子

如果您想要一个包含JavaFX依赖项的完整胖子,仍然可以使用工件。

转到File -> Project Structure -> Artifacts -> Add -> JAR -> From modules with dependencies,添加主类,接受。

然后从列表中保留 JavaFX jar ,并接受。构建项目。

理论上,您应该能够像这样运行它:

java -jar out\artifacts\HelloFX_jar\HelloFX.jar

但是这行不通。

原因1:您需要一个启动器类,如here所述。

因此创建一个启动器类:

public class Launcher {

    public static void main(String[] args) {
        Main.main(args);
    }
}

原因2:如果仅将SDK jar添加到胖jar中,则会缺少本机库,如here所述。

因此,请编辑工件,选择Launcher类作为主类,然后添加本机库(在Windows上为Directory Content -> path-to/JavaFX SDK/bin

Fat Jar

现在构建项目(现在jar约为33 MB,并包含不必要的本机库)并运行:

java -jar out\artifacts\HelloFX_jar\HelloFX.jar

您可以分发此jar,但只能分发到Windows平台。

如果您下载了其他平台的JavaFX SDK,则可以为其他平台创建类似的jar,如果将它们全部添加在一起,也可以构建跨平台的jar,如上面的链接的答案所述。

无论如何,您应该考虑使用jlink instead

注意

关于此错误:

  

原因:java.lang.ClassNotFoundException:Files \ Java \ javafx-sdk-11.0.1 \ lib

似乎库路径设置为不带引号,并且它缺少路径C:\Program Files\...的第一部分。只要确保使用引号即可:

set PATH_TO_FX="C:\Program Files\Java\javafx-sdk-11.0.1\lib"

答案 1 :(得分:2)

在使用 JavaFX和IntelliJ Non-modular with Gradle https://openjfx.io/openjfx-docs/

导出/生成Jar时,我遇到了类似的问题

我使用Gradle jar命令生成的jar无法运行,并抛出错误,表明找不到主类。当我打开罐子时,我可以找到我的主班。因此我意识到错误与Jar Packaging有关。

enter image description here

我通过在IntelliJ中的Java SDk中添加JavaFX SDK来解决了该问题,如下所示。

enter image description here

此后,我使用常规的Gradle build Jar命令生成我的Jar文件(如下所示),并且该文件正常运行。

enter image description here

答案 2 :(得分:1)

以上答案适用于非模块化 JavaFX 项目。为了让模块化 JavaFX 项目(具有模块化依赖项)运行,我使用了 jlink。

将 JavaFX SDK 从 https://gluonhq.com/products/javafx/; 解压到一个目录,并将 shell 变量 JFX_LIB 指向解压后的 lib/ 目录。

https://gluonhq.com/products/javafx/; 中提取 JavaFX jmods(不是 SDK)文件,解压 jmods,它们位于类似于 javafx-jmods-11.0.2/ 的文件夹中。将 shell 变量 JMOD_PATH 指向解压后的目录 javafx-jmods-11.0.2/

编译,将编译后的类发送到目录mods/

javac -d mods  --module-source-path src --module-path $JFX_LIB/javafx.graphics.jar:$JFX_LIB/javafx.base.jar:$JFX_LIB/javafx.controls.jar --module com.mymodule

用jlink创建自定义JRE,参考包含JavaFX mods和自己编译的mod的模块路径:

jlink --module-path $JMOD_PATH:mods --add-modules com.mymodule --output customjre

运行:

customjre/bin/java --module com.mymodule/com.mymodule.Main

(我尝试了很长时间来让 java -jar--module-path--add-modules 一起运行。我总是收到以下错误:)

Error: Could not find or load main class com.mymodule.Main
Caused by: java.lang.NoClassDefFoundError: javafx/application/Application

答案 3 :(得分:0)

最简单的方法是使用包含JavaFX的OpenJDK构建。 Bellsoft和Azul都生产这种版本。

对于Azul的Zulu版本的OpenJDK: https://www.azul.com/downloads/zulu-community/?version=java-11-lts&package=jdk-fx

对于Bellsoft Liberica JDK: https://bell-sw.com/pages/downloads/#/java-11-lts 然后选择“完整JDK”

这些构建基本上是OpenJDK,其中添加了OpenJFX JavaFX模块。尽管要小心,因为LibericaFX可能不支持JavaFX的某些方面。参见https://bell-sw.com/pages/liberica-release-notes-11.0.9.1/