14

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

4

4 回答 4

20

如果您有一个简单的(非模块化)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"
于 2018-11-29T10:12:52.067 回答
3

我在使用JavaFX 和 IntelliJ Non-modular with Gradle导出/生成 Jar 时遇到了类似的问题(https://openjfx.io/openjfx-docs/

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

在此处输入图像描述

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

在此处输入图像描述

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

在此处输入图像描述

于 2019-09-30T12:54:39.783 回答
2

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

对于 OpenJDK 的 Azul 的 Zulu 构建: 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 并选择“Full JDK”

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

于 2020-12-07T00:56:03.957 回答
1

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

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

从https://gluonhq.com/products/javafx/获取 JavaFX jmods(不是 SDK)文件;解压缩 jmod,它们位于类似于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 mod 和您自己编译的 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-pathand --add-modules。我总是收到以下错误:)

Error: Could not find or load main class com.mymodule.Main
Caused by: java.lang.NoClassDefFoundError: javafx/application/Application
于 2021-02-12T14:42:54.347 回答