[我有一个应用程序在从Eclipse导出为可运行jar并允许其将所需的库打包到生成的JAR中之后,可以很好地与“ java -jar blah.jar”一起运行。
我添加了一些JavaFX代码来弹出Web浏览器。现在看来,不可能创建可在次要Java版本上运行的可运行jar。当我将其导出为可运行的jar时,它会复制到特定于我的次要版本的jfxrt.jar中。如果我使用“ java -jar blah.jar”运行此jar以获得完全匹配的Java版本(jdk1.7.0_17),则它可以正常工作,但是如果我使用一个较新的版本(jdk1.7.0_45),则它将无法解决swingx正确上课。 “在任何地方写一次即可运行”的内容就太多了。
我曾尝试使用JavaFX ant任务,但无法实际打包相关的jar。这实际上并没有在创建的jar中包含fx:resources jar,就像魔术般的月食“将所需的库打包到生成的JAR中”一样完美:
<fx:jar destfile="${dist}/${dist.jar}">
<fx:application id="BlahTesterApp"
mainClass="blah.MainClass"
toolkit="swing"/>
<fileset dir="${build}"/>
<fx:resources>
<fx:fileset dir="${lib}" includes="**/*.jar" />
</fx:resources>
<manifest>
<attribute name="Implementation-Vendor" value="My Team"/>
<attribute name="Implementation-Title" value="Tester App"/>
</manifest>
</fx:jar>
而且似乎只能创建我不想要的“本地包”。我不想让用户过去只能运行织补jar时安装rpm或deb。
我不明白为什么Oracle必须在这里引入自己的神奇的额外的部署复杂性层。他们不希望人们使用JavaFX吗?
更新,2019年12月
由于该主题的答案似乎随着时间的流逝而变化和变化(并且看起来它将继续如此)。我的建议是查阅https://openjfx.io的文档,以审查打包JavaFX应用程序的最新最佳实践。
我曾尝试使用JavaFX ant任务,但无法获得将实际的jar打包的任务……而且似乎只能创建我不想要的“本地包”。
openjfx.io的当前建议是为JavaFX应用程序创建一个跨平台的jar,其中包括依赖项,而跨平台的JavaFX库则使用其他构建工具(例如Maven或Gradle而不是Ant)。
使用这些构建工具的功能(例如Maven Shade plug-in),将带有代码的依赖jar打包到uber-jar中。
[执行此操作时,如果要使生成的jar具有跨平台功能,例如要在Window + Mac + Linux上工作,则需要将所有跨平台jar作为依赖项打包到uber-jar中(为您的项目使用适当的JavaFX版本)。
<dependencies>
...
<dependency>
<groupId>org.openjfx</groupId>
<artifactId>javafx-graphics</artifactId>
<version>13</version>
<classifier>win</classifier>
</dependency>
<dependency>
<groupId>org.openjfx</groupId>
<artifactId>javafx-graphics</artifactId>
<version>13</version>
<classifier>linux</classifier>
</dependency>
<dependency>
<groupId>org.openjfx</groupId>
<artifactId>javafx-graphics</artifactId>
<version>13</version>
<classifier>mac</classifier>
</dependency>
</dependencies>
生成的jar将需要更新的Java版本(例如Java 11 +)。
[目前有一个针对Java 14的孵化项目(JEP 343:打包工具),其目标如下(这些问题与问题中所要求的不同,因为打包工具用于创建本机安装程序,这特别是这个问题不想做什么):
[基于JavaFX javapackager工具创建一个简单的打包工具,该:
- 支持本地打包格式,以为最终用户提供自然的安装体验。这些格式包括Windows上的msi和exe,macOS上的pkg和dmg以及Linux上的deb和rpm。
- 允许在打包时指定启动时间参数。
- 可以从命令行直接调用,也可以通过ToolProvider API以编程方式调用。
提议的项目存在,因为:
为了解决这些要求,以前在Oracle的JDK 8中分发了一个名为javapackager的打包工具。但是,作为删除JavaFX的一部分,该工具已从Oracle的JDK 11中删除。
注意,由于上述更新,在发布Java 14之前,下面提到的某些打包建议(例如javafxpackager)仅适用于现在已经过时的较旧的Java发行版(8-10)。
此外,关于不包含Java平台库的建议已过时。从Oracle Java 8到Oracle Java 10,JavaFX都包含在基本JRE(Java运行时环境)中。从Java 11开始,JavaFX不包含在基本JRE中,实际上,必须将平台库单独添加到Java模块路径中。再次,查看https://openjfx.io以获取JavaFX应用程序的打包选项。
过时的信息:
JavaFX包装替代方案
Alternative(1),e(fx)clipse包装,因为您正在使用Eclipse。
Advice
切勿在应用程序中包含Java平台库(例如jfxrt.jar)。您在互联网上找不到任何指南可以指导您执行此操作(由于问题中概述的次要版本之间存在明显的不兼容)。此规则的唯一例外是,如果您要构建一个不依赖于预安装的JRE(不是)的独立的,本机安装的应用程序。