如何为不使用本机安装程序的使用JavaFX的应用程序创建可运行的jar

问题描述 投票:8回答:1

[我有一个应用程序在从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吗?

java eclipse ant jar javafx
1个回答
12
投票

更新,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包装替代方案

  1. 遵循e(fx)clipse tutorial使用Eclipse创建JavaFX应用程序的可执行jar文件。
  2. Oracle java打包ant任务和javafxpackager工具可以创建可执行jar(在Oracle文档中描述为standalone applications)。如果您无法使用工具生成此类jar,则可能无法正确使用工具。
  3. 需要最低版本的Java 8,其中jfxrt.jar(即JavaFX类)位于引导类路径上。
  4. [使用第三方构建工具链,例如JavaFX Maven pluginJavaFX Gradle plugin
建议您

Alternative(1),e(fx)clipse包装,因为您正在使用Eclipse。

Advice

切勿在应用程序中包含Java平台库(例如jfxrt.jar)。您在互联网上找不到任何指南可以指导您执行此操作(由于问题中概述的次要版本之间存在明显的不兼容)。此规则的唯一例外是,如果您要构建一个不依赖于预安装的JRE(不是)的独立的,本机安装的应用程序。

© www.soinside.com 2019 - 2024. All rights reserved.