可以使用 javapackager 部署 jlinked 运行时吗?

Can a jlinked runtime be deployed with javapackager?

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

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

Exception: java.lang.Exception: Error: Modules are not allowed in srcfiles: [dist\tcdmod.jar].

如果我使用等效的 non-modular jar,生成的包将包含完整的运行时。但是我想使用 /dist 文件夹中的 jlink 减少的运行时间。

javapackager 命令可以使用 jlink-generated 运行时进行部署吗? 怎么样?

标题为 "Customization of the JRE" 的部分没有提及 javapackager 命令。

下面的部分 "Packaging for Modular Applications" 有一行:

Use the Java Packager tool to package modular applications as well as non-modular applications.

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 之外的已安装运行时。

JDK9及以上版本提供的javapackager使用jlink生成jre镜像:

For self-contained applications, the Java Packager for JDK 9 packages applications with a JDK 9 runtime image generated by the jlink tool. To package a JDK 8 or JDK 7 JRE with your application, use the JDK 8 Java Packager.

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 运行 jlink 带有 --compress=2 标志,生成具有 Zip 级别压缩的 JRE 图像。

此外,带有标志 -Bverbose=true 的 运行ning javapackager 会准确地向您显示哪些参数被传递给 jlink,输出中有这样一行:

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