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

2022-09-03 12:50:37

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

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

但是项目的输出.jar文件(使用Artifects制作)不会运行。我测试了这些命令,但没有机会:

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:Project Structure > Artifects >添加>JAR>来自具有依赖项的模块>主类:main。主要。


答案 1

如果你有一个简单的(非模块化的)JavaFX 11项目(没有Maven/Gradle构建工具),并且你正在使用IntelliJ,就像这里的HelloFX示例一样,这就是你如何从IntelliJ创建一个可以从控制台运行的jar。

可以在此处找到有关如何运行项目的完整教程,以及有关如何创建jar的说明(请参阅非模块化项目部分),但这些并不涉及IntelliJ。Artifacts

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

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

where 已设置在 中,指向 JavaFX SDK 库。PATH_TO_FXFile -> Settings -> Appearance & Behavior -> Path Variables

脂罐

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

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

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

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依赖项的完整胖jar,你仍然可以使用Artifacts。

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

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

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

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

但这行不通。

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

因此,创建一个启动器类:

public class Launcher {

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

原因 2:如果您只将 SDK jar 添加到胖 jar 中,您将缺少本机库,如此所述。

因此,编辑工件,选择启动器类作为主类,然后添加本机库(在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

注意

关于此错误:

Caused: 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"

答案 2

我在使用JavaFX和IntelliJ非模块化与Gradle导出/生成Jar时遇到了类似的问题(https://openjfx.io/openjfx-docs/)

我使用Gradle jar命令生成的jar没有运行并抛出错误,说它找不到我的主类。当我打开罐子时,我能够找到我的主要班级。所以我意识到这个错误与Jar包装有关。

enter image description here

我通过将JavaFX SDK添加到IntelliJ中的Java SDk中来解决此问题,如下所示。

enter image description here

在此之后,我使用常规的Gradle构建Jar命令来生成我的Jar文件(如下所示),并且它运行正常。

enter image description here


推荐