如何在没有本地安装程序的情况下为使用JavaFX的应用程序制作可运行的jar



我有一个应用程序,在从Eclipse导出为可运行的jar并让它"将所需的库打包到生成的jar中"后,它可以用"java-jarblah.jar"运行。

我添加了一些JavaFX代码来弹出一个网络浏览器。现在看来,要制作一个可在小型Java版本中运行的jar是不可能的。当我将它导出为可运行的jar时,它会复制到我的次要版本所特有的jfxrt.jar中。如果我为完全匹配的java版本(jdk1.7.0_17)使用"java-jar-blah.jar"运行这个jar,那么它运行得很好,但如果我使用稍新的版本(jdk1.7.0_45),那么它无法正确解析swingx类。"随时随地写一次"就到此为止。

我尝试使用JavaFXant任务,但我无法获得实际打包依赖jar的任务。这实际上并不包括它创建的jar中的fx:resources jar,就像神奇的eclipse"将所需库打包到生成的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吗?

有关使用JavaFX组件创建可执行单个jar的详细信息,请参阅:

  • Maven Shade JavaFX运行时组件丢失

更新,2019年12月

这个话题的答案随着时间的推移而演变和变化,使得最初的答案和建议过时了。

  • 在上查看当前文档https://openjfx.io查看打包JavaFX应用程序的最新最佳实践
  • 还要查看JavaFX标记中的打包信息

我尝试使用JavaFX ant任务,但我无法获得实际打包依赖jar的任务。。。并且似乎只能创造";本地捆绑包";这是我不想要的。

首先,对于大多数读者来说,最好创建一个基于jlinkjpackage的分发包,而不是单个jar文件。

如果你真的需要一个跨平台的单jar文件,openjfx.io目前的建议是使用Maven或Gradle而不是Ant作为构建工具。

使用这些构建工具的功能(例如MavenShade插件)将您的依赖jar和代码打包到一个uber jar中。

在执行此操作时,如果您希望生成的jar具有跨平台功能,例如在Windows+Mac+Linux上工作,则需要将所有跨平台jar作为依赖项打包到uber jar中(为您的项目使用适当的JavaFX版本)。您还需要提供一个启动器主类,它不包含Application的子类。

<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+)。


早期更新的过时信息:如果使用现代JavaFX发行版,则忽略

目前有一个针对Java14的孵化项目(JEP343:Packaging Tool),目标如下(这些目标与问题中所需的不同,因为打包工具用于创建本地安装程序,而这正是问题不想做的):

基于JavaFXjavapackager工具创建一个简单的打包工具:

  • 支持本机打包格式,为最终用户提供自然的安装体验。这些格式包括Windows上的msi和exe,macOS上的pkg和dmg,Linux上的deb和rpm
  • 允许在打包时指定启动时间参数
  • 可以从命令行直接调用,也可以通过ToolProvider API以编程方式调用
  • https://openjdk.java.net/jeps/343(指向打包项目wiki页面的链接)

拟建项目的存在是因为:

为了满足以前的这些需求,Oracle的JDK8发布了一个名为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发行版,则忽略

JavaFX包装替代品

  1. 按照e(fx)clipse教程使用Eclipse为JavaFX应用程序创建可执行jar文件
  2. Oraclejava打包ant任务和javafxpackager工具可以创建可执行jar(在Oracle文档中描述为独立应用程序)。如果您不能使用这些工具生成这样的jar,那么您很可能没有正确使用这些工具
  3. 需要最低版本的Java 8,其中jfxrt.jar(即JavaFX类)位于引导类路径上
  4. 使用第三方构建工具链,如JavaFXMaven插件或JavaFXGradle插件

由于您正在使用Eclipse,因此建议您使用替代方案(1)e(fx)clipse封装。

建议(过时)

永远不要尝试在应用程序中包含Java平台库(如jfxrt.jar)。你在互联网上找到的任何指南都不应该指示你做这样的事情(因为你在问题中概述的小版本问题之间明显不兼容)。该规则的唯一例外是,如果您正在构建一个独立的、本机安装的应用程序,该应用程序不依赖于预安装的JRE(您不是)。

相关内容

  • 没有找到相关文章

最新更新