JavaFX 无法构建出发布包 - 在该 JDK 版本中 fx:deploy 不可用

17

我有一个JavaFX项目,希望将其构建为Jar文件。然而,当我尝试这样做时,出现了错误。

Error:Java FX Packager: Can't build artifact - fx:deploy is not available in this JDK

我在这里发现了一个相似的问题,但是看起来他们没有得出结论。


首先,我从https://gluonhq.com/products/javafx/下载了JavaFX SDK,然后我创建了一个批处理文件,并包含了类似以下内容的代码:java --module-path PATH_TO_JAVAFX_SDK --add-modules=javafx.controls,javafx.fxml -jar PATH_TO_YOUR_JAR_FILE - Leeuw
2个回答

14

出现这种情况的原因可能是您安装了多个JDK,导致编译和运行使用不同的JDK版本,或者在Intellij中创建构件时使用了破损的Javafx应用程序jar功能。在执行以下步骤之前,请确保您正在使用相同的JDK版本进行编译和运行。

1 - 创建一个启动器类:

启动器类将调用主JavaFx类,从中运行您的应用程序。直接通过主类创建Jar文件会产生以下错误:

    Error: Could not find or load main class Main
    Caused by: java.lang.ClassNotFoundException: Main 

你的启动器类应该看起来像这样:

    public class Launcher {
        public static void main(String[] args) {
            MainGUI.main(args);
        }
    }

2 - 进入构建JAR阶段

  1. 你可能仍然拥有上一次构建的META-INF文件夹,所以请将其删除。

  2. 构建项目为JAR包:
    文件->项目结构 -> 艺术品 -> "+" -> JAR->从具有依赖关系的模块中..

  3. 选择启动器类作为主类,并勾选“复制到输出目录并通过清单链接”,然后按下“确定”。

  4. 点击“应用”再点击“确定”。

  5. 转到“Build-> Build artifacts-> Rebuild”。


1
这里有一个很棒的视频,解释了第二个选项: https://www.youtube.com/watch?v=HGHu-SzL-5E&ab_channel=AlexHorea - Dan A.S.
我知道我在恢复一个旧话题(不好的做法),但我只是想说一句巨大的“谢谢!”因为你救了我,让我不至于浪费我的工作在一个看似无法打包的程序上。 - Kotaka Danski
成功了!没有添加模块也没有错误!谢谢。 - FarshiD Naqizadeh

1
我在JetBrains网站上找到了一篇关于打包JavaFX应用程序的好文章,对我很有帮助。在#故障排除部分中提到:
Error:Java FX Packager: Can't build artifact – fx:deploy is not available in this JDK

The fx:deploy task was a part of the Ant plugin that was formerly distributed in ant-javafx.jar as a part of Java Packager. The Ant plugin is not included in jpackage in the current JDK versions.

If you're using a JDK build of version 9 and later, use third-party solutions for packaging. For example, refer to section Runtime images in the JavaFX official documentation.


1
这是一个很好的总结。此外,如果有人想将Java(或JavaFX)应用程序打包为本机应用程序(例如Windows exe、Linux rpm或deb包或OS X dmg安装的应用程序),则可以考虑使用jpackage实用程序,该实用程序作为JDK 14+中的孵化功能实现。对于某些应用程序,这可能比JavaFX 运行时映像文档化的当前选项提供更好的要求适配。 - jewelsea
@jewelsea 谢谢你提到了 jpackage。你能帮我解决一下这个问题吗?我正在尝试为一个 JavaFX 模块化 Maven 项目创建本地可执行文件。使用 javafx-maven-plugin,我可以创建一个带有启动器脚本的运行时镜像,然后通过 jpackage 打包它,得到一个打包好的 exe 安装程序,它可以正常工作。但是,它会安装那个启动器脚本。但是我需要安装运行的 exe 文件。有什么建议吗? - Tharindu Sathischandra
请提出一个新问题,Tharindu。这样做可以让多个人回答,您将有更好的机会找到具有适当知识的人来为您创建一个好的答案,并且会有记录,某人可以搜索以获取类似问题的答案。 - jewelsea
有点遗憾,本应是一个IDE的东西居然不能创建项目的最终输出。我的意思是,如果它只适用于Java 8及以下版本,在大多数情况下都是无用的。我不明白为什么IntelliJ没有包含Java 9+的解决方案(无论是他们自己的还是第三方的)。除非JavaFX正在消亡或者IntelliJ已经放弃了它。 - Damn Vegetables

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接