【问题标题】:How to use Jpackage to make a distribution format for JavaFX applications如何使用 Jpackage 为 JavaFX 应用程序制作分发格式
【发布时间】:2021-10-22 14:02:43
【问题描述】:

由于 .jar 不再是用于分发我们的 JavaFX 项目的最佳格式,因此我愿意使用 JPackage 工具来代替,但是在阅读了这篇文章:https://stackoverflow.com/a/68823040/4262407 之后,我最终遇到了多个问题,但首先,我只是想确保我已经很好地理解了我应该遵循的过程:

过程:

1-创建模块化项目

2-将项目打包成 .jar 格式

3-使用工具Jlink创建自定义运行时镜像(以减小输出大小)

4-使用工具jpackage(需要2和3作为输入)

我还想知道是否可以依靠 Intellij 工件来创建 .jar 文件(第 2 步)使用特定插件更好吗?

最后不清楚的是我们是否需要在 .jar 文件中包含依赖项?因为我相信它们会包含在自定义运行时中,不是吗?

【问题讨论】:

    标签: java javafx javafx-11 jpackage


    【解决方案1】:

    只需在https://github.com/dlemmermann/JPackageScriptFX 上查看带有工作示例的教程。它对非模块化项目特别有用。

    【讨论】:

    • 这听起来像是一个转储问题,但该教程有点令人困惑,我应该使用项目提供的脚本还是使用 README 中的步骤,因为我使用 Jdeps 使用教程中的命令“ detected_modules=$JAVA_HOME/bin/jdeps --multi-release ${JAVA_VERSION} ..." 并且在 windows CMD "detected_modules=" 中不允许使用变量
    【解决方案2】:

    如果你看一下here,这里有关于如何从包含 Maven 插件的模板开始创建 JavaFX 项目的说明,以便使用 jlink 轻松打包应用程序。

    这样做可以让您完全依赖 IntelliJ,让事情变得更容易。

    获得运行时映像后,您可以使用jpackage 打包它。已经有关于这个话题的讨论here

    这里是the article mentioned there 的快速链接。那里的文章展示了它使用 Gradle,但您可以使用 Maven 做同样的事情,只需使用适当的插件(jpackage-maven-plugin,如another answer 中所述)。

    另外,从我在您的 cmets 中可以看出,您似乎同时具有模块化和非模块化依赖项。在这种情况下,您可以使用jdeps 来实现您所需要的。有一个关于混合依赖的nice article here,它专门使用 JavaFX 作为非模块化应用程序中的模块化库的示例。

    【讨论】:

    • 是的,你是对的,使用 maven 创建运行时映像很容易,但是 jpackage 呢?我也可以依靠 Intellij 工件来创建 .jar 文件吗?
    • 可以使用jpackage打包使用jlink生成的运行时镜像。我用两个链接更新了我的答案:一个指向之前关于使用jpackagejlink 的讨论,另一个是那里提到的文章,它解释了如何做到这一点。
    • 从其他 cmets 我看到您正在使用模块化依赖项和非模块化依赖项的混合。我在我的答案中添加了一个链接以涵盖该部分以及jdeps。另外,我忘了提及这一点,但如果您使用 IntelliJ 生成 JavaFX 项目,您应该知道 JDK 9+ 的 ant 任务已损坏,因此您不能依赖它,因为它记录在 official jetbrains page 中。
    【解决方案3】:

    jpackage 工具不需要模块化项目。尽管如果您的项目不是模块化的,那么由于 JavaFX 是模块化的,您的项目将是混合的。在这种情况下,您需要将 JavaFX 模块添加到自定义运行时映像中,同时告诉 jpackage 将您的代码视为非模块化(即,它将配置可执行文件以将您的代码放在类路径中)。

    您还可以将第 3 步和第 4 步合并为一个步骤。 jpackage 工具可以生成自定义运行时映像。它将使用jlink“幕后”。

    至于你的代码需要采用什么格式,在我看来,将它打包成一个 JAR 文件将是最直接的。但我不确定这是严格必需的

    您的应用程序的任何依赖项当然都需要包含在最终应用程序中。如果这些依赖项是模块化的,那么您可以通过自定义运行时映像将它们包含在内。但是,如果您希望它们出现在类路径中,则可以以与代码相同的方式包含它们(即--input)。

    注意jpackage 工具有一个用户指南:https://docs.oracle.com/en/java/javase/16/jpackage/packaging-overview.html

    【讨论】:

    • 其实我的项目是模块化的,但问题是使用的依赖“JasperReport”不是,我认为需要我应该使用jdeps,对吧?
    • 命名模块不能引用未命名模块中的成员,尽管未命名模块中的代码可以引用命名模块中的成员。因此,如果您的代码是模块化的,那么“JasperReport”很可能会变成所谓的自动模块。过去jlink 无法与自动模块一起使用,但在最近的版本中可能发生了一些变化。如果事情没有改变,那么是的,您必须以某种方式将“JasperReport”转换为显式模块。或者您可以将代码放在类路径(即未命名模块)上,同时将 JavaFX 保留在模块路径(即命名模块)上。
    【解决方案4】:

    我使用 jpackage maven 插件构建了本机可执行文件(https://search.maven.org/artifact/org.panteleyev/jpackage-maven-plugin)。 您首先必须使用 maven-javafx-plugin 创建 jlink 运行时映像 (https://github.com/openjfx/javafx-maven-plugin)。 然后,您将在 jpackage plugin(... ) 中使用该运行时映像。然后应该成功创建可执行文件。

    【讨论】:

    • 感谢您的回答,不幸的是,使用来自 maven 的 jlink 对我来说不是一个选项,因为我的项目具有非模块化依赖项:(
    猜你喜欢
    • 1970-01-01
    • 2020-08-01
    • 1970-01-01
    • 2021-05-24
    • 2010-12-27
    • 2013-03-03
    • 2010-10-30
    • 2021-04-05
    相关资源
    最近更新 更多