什么是部署JavaFX应用程序的最佳方法?创建JAR和自包含应用程序以及本地安装程序。

23

我正在使用 IntelliJ IDEA,已经准备好将我的 JavaFX 应用程序部署。问题是,当我生成 JAR 文件时,它无法运行。在命令行中运行时,会出现异常 FXMLLoadException,尽管该项目在我的 IDE 中完美运行。

Ant 任务以错误结束,在构建 15 分钟后,我真的不明白到底出了什么问题。

所以我的问题是,如何正确地部署 JavaFX 应用程序,任何教程或指南都会受到欢迎。


1
你能发一下你ant日志的最后几行吗?FXMLLoadException听起来像是你的.fxml文件没有包含在你的.jar中。你可以尝试解压缩这个jar(unzip jarfile.jar)并搜索你的.fxml文件。无论如何,我正在使用Travis CI的gradle,并且它允许部署到许多不同的部署提供商。 - michaeln
3个回答

29
一种Java应用程序可以以各种方式打包。请查看 Java Packaging Overview,了解有关它的所有内容。其中一种封装方式是自包含的Java应用程序
创建这些软件包的不同方法如下:
  • 使用随JDK提供的javapackager工具
  • JavaFX Ant任务
  • Maven项目的JavaFX Maven插件
自包含应用程序是将您的应用程序打包的一种方式,也是特定于平台的。该捆绑包含:
  • 应用程序包
  • JRE的私有副本
可在此处找到可用的捆绑包列表。
让我们检查一下我们可以使用的各种工具及其使用方法: JavaPackager工具

JavaPackager工具是最基本的工具,帮助您编译、打包、签名和部署Java(FX)应用程序,无需编写任何额外的脚本。 javapackager.jar文件位于JDK安装的bin目录中。

可以使用的命令列表在此处提供。

JavaFX Ant任务

JavaFX Ant任务通过为您的项目创建build.xml文件来帮助您打包应用程序。

有关如何使用Ant脚本的一组示例可以在此处找到。

可以使用的命令列表在这里提供。

JavaFX Maven Plugin

JavaFX Maven Plugin 利用了将 Java 应用程序打包到 Maven 平台的方式。您可以通过向项目添加插件来使用它来打包基于 Maven 的 Java 应用程序。

我认为,这个插件是三个插件中最易于使用的。它是一个非常好的编写、易于理解的工具,并且有广泛的文档。

JavaFX Gradle Plugin

JavaFX Gradle Plugin 也是由 Maven 插件的作者开发的。它具有 Maven 插件所有的功能,但适用于 Gradle :)

进一步阅读:


2
谢谢,你能更新一下“JavaFX Maven插件”的链接吗?它已经失效了。我以前从未使用过Maven,对于像我这样的新手来说,没有得到任何信息。:-/ - Martin Pfeffer
2
JavaFX Maven插件对我来说非常好用,而且使用起来非常简单。只需将插件添加到pom中,然后执行一个命令,例如"mvn jfx:native"即可。 - jack jin
请注意,javapackager 工具已被弃用并替换为 jpackage,请参阅:JEP 392: Packaging Tool - jewelsea
1
JavaFX Maven插件的链接已经过时且失效,已被以下链接所取代:托管于Github上的OpenJFX JavaFX Maven插件 - jewelsea
这篇文章中的一些博客链接现在也已经失效了。 - jewelsea
2
目前最全面且最新的资源(虽然不是真正的全面)是 openjfx.io 文档 - jewelsea

1
如果您使用Maven,另一个非常聪明的方法是使用maven-shade-pluginlink)。它会构建一个包含所有依赖项的大而全的jar文件,您可以直接执行它,无需进行任何其他操作。您可以与javafx-maven-plugin结合使用。我也尝试了不同的方法并玩了很长时间,这个解决方案是唯一真正有效的解决方案。此外,它很容易设置。
以下是您需要添加到pom.xml中的内容:
<build>
    <plugins>
        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-shade-plugin</artifactId>
            <version>3.1.1</version>
            <configuration>
            </configuration>
            <executions>
                <execution>
                    <phase>package</phase>
                    <goals>
                        <goal>shade</goal>
                    </goals>
                    <configuration>
                        <transformers>
                            <transformer implementation="org.apache.maven.plugins.shade.resource.ManifestResourceTransformer">
                                <mainClass>your.package.name.Main</mainClass>
                            </transformer>
                        </transformers>
                    </configuration>
                </execution>
            </executions>
        </plugin>
        <plugin>
            <groupId>com.zenjava</groupId>
            <artifactId>javafx-maven-plugin</artifactId>
            <version>8.8.3</version>
            <configuration>
                <mainClass>your.package.name.Main</mainClass>
            </configuration>
        </plugin>
    </plugins>
</build>

在进行阴影和JavaFX插件之前,请更改mainClass中的软件包名称,然后您就完成了。现在,您可以像往常一样使用mvn package构建应用程序。

这里引用的zenjava JavaFX Maven插件已经过时且损坏,已被以下插件所取代:托管在GitHub上的openjfx javafx-maven-plugin - jewelsea
对于最近的JavaFX应用程序(例如JavaFX 11+),不建议使用maven shade创建jar。 JavaFX 11+旨在作为模块化分发的一部分运行,这并不真正设计为与阴影jar兼容。请参阅openjfx文档以获取有关运行时图像生成的其他选项。 - jewelsea

1

Oracle在其网站上为JavaFX 2JavaFX 8提供了广泛的打包指南。

如果您需要针对特定问题的帮助,请发布代码和您收到的错误堆栈跟踪。


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