【问题标题】:Can a jlinked runtime be deployed with javapackager?可以使用 javapackager 部署 jlinked 运行时吗?
【发布时间】:2018-06-03 14:48:03
【问题描述】:

Java SE 部署指南中示例 2-1 上方的 javapackager 说明/Self-Contained Application Packaging 声明 -deploy 命令中需要 jar 文件。

如果我使用模块化 jar,我会收到以下错误消息:

异常:java.lang.Exception:错误:srcfiles 中不允许使用模块:[dist\tcdmod.jar]。

如果我使用等效的非模块化 jar,则生成的包包含完整的运行时。但我想使用 /dist 文件夹中的 jlink 减少的运行时间。

javapackager 命令能否使用 jlink 生成的运行时进行部署? 怎么样?

标题为“自定义 JRE”的部分没有提到 javapackager 命令。

以下“模块化应用程序打包”部分有以下一行:

使用 Java Packager 工具来打包模块化应用程序以及非模块化应用程序。

Java Packager 工具是否与javapackager 不同?本节没有使用javapackager 的示例。

这是我使用的 javapacker 命令:

javapackager -deploy -native -outdir packages -outfile ToneCircleDrone -srcdir dist -srcfiles tcdplain.jar -appclass com.adonax.tanpura.TCDLaunch -name "ToneCircleDrone" -title "ToneCircleDrone test"

javapackager 文档中的说明没有提及使用 jlink 运行时的场景。有一个 Bundler 参数 -Bruntime 但它仅用于指向已安装的运行时,而不是系统默认值 AFAIK。

【问题讨论】:

  • 来自 java-gaming.org 的回答表明可以连接到 jlink 运行时。 java-gaming.org/index.php/topic,38682.0.html#msg369300 如果我真的跟进并测试它,我会将此评论提升为“回答”。我可能会接受建议直接将 jlink 与 3rd 方安装程序一起使用。
  • 我最终遵循了另一个部署 jlink 应用程序的课程:(1) 命令行编译,(2) 使用命令行 jlink,(3) 使用 Inno Setup 5 打包创建的发行版与 jlink。所有步骤都写在 java-gaming.org 上发布的演练中。 java-gaming.org/topics/deployment-and-packaging/38754/msg/…

标签: javapackager


【解决方案1】:

JDK 9 及以上版本提供的javapackager 使用jlink 生成jre 映像:

对于自包含应用程序,JDK 9 包的 Java Packager 具有由 jlink 工具生成的 JDK 9 运行时映像的应用程序。至 将 JDK 8 或 JDK 7 JRE 与您的应用程序一起打包,使用 JDK 8 Java 打包器。

https://docs.oracle.com/javase/9/tools/javapackager.htm#JSWOR719

您甚至可以使用-BjlinkOptions=<options> 将参数传递给jlink

另外,-Bruntime 仅对使用 -deploy -native jnlp 部署的包有效

要编译模块化应用程序,请使用--module-path <dir>,而不是-srcdir,然后使用-m <module name> 指定主模块。

编辑:虽然没有关于 -BjlinkOptions 的文档,但它存在于 javapackager 源代码中

jdk.packager/jdk.packager.internal.legacy.JLinkBundlerHelper

https://github.com/teamfx/openjfx-10-dev-rt/blob/bf971fe212e9bd14b164e4c1058bc307734e11b1/modules/jdk.packager/src/main/java/jdk/packager/internal/legacy/JLinkBundlerHelper.java#L96

示例用法:-BjlinkOptions=compress=2 将使javapackager 运行带有--compress=2 标志的jlink,生成具有Zip 级别压缩的JRE 图像。

此外,使用 -Bverbose=true 标志运行 javapackager 将准确显示哪些参数正在传递给 jlink,并在输出中使用如下所示的一行:

userArguments = {strip-debug=1 compress=2}

【讨论】:

  • 可以通过说明使用 -BjlinkOptions 的示例或链接到其用法的文档以及 -Bruntime 注释的一些上下文来改进答案。后者具有目前所写的不合理的方面。此命令与正在回答的问题有何关系?解释如何使用 -srcdir 修改命令以使用 --module-path 进行模块化应用程序的部分非常有帮助(假设它有效)。但是,如果使用我的示例或 javapackager doc 场景示例作为所需更改的起点来编写完整的行示例,则会更有帮助。
  • 感谢您在编辑中提供更多信息。我可以支持你的答案,但我没有花时间测试它是否有效,因为我现在通过命令行使用 JLink,并使用 InnoSetup5 打包。
  • 在我看来,如果这个答案有任何问题,其他人有很多机会提出问题。由于没有异议,我选择它作为有效的解决方案。但是,我这样做是因为我没有亲自测试过它,而是采取了另一条路。
猜你喜欢
  • 1970-01-01
  • 2015-04-26
  • 1970-01-01
  • 1970-01-01
  • 2020-02-20
  • 1970-01-01
  • 2011-12-29
  • 2013-05-28
  • 1970-01-01
相关资源
最近更新 更多