首页 > 解决方案 > 如何使用 JDK 11 打开 JavaFX .jar 文件?

问题描述

我在 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

ps:在JDK-10上构建时我可以运行这个项目的.jar文件

编辑

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

然后我在这个过程中为输出 jar 文件创建了 Artifect:项目结构 > Artifects > Add > JAR > From Modules with dependencies > main Class : main.Main。

标签: javajavafxjava-11openjfx

解决方案


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

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

检查 HelloFX 项目是否使用以下 VM 选项从 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 jar,并接受。

半罐

构建项目,它将创建一个非常小的 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 添加到 fat jar,您将缺少本机库,如此所述。

所以编辑工件,选择 Launcher 类作为主类,并添加本机库(Directory Content -> path-to/JavaFX SDK/bin在 Windows 上):

脂肪罐

现在构建项目(现在 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"

推荐阅读