Java9 带有 jlink 压缩标签的打包器

Java9 packager with jlink compress tags

当我们创建 jlink 运行时映像时,我们可以使用诸如“--strip-debug”、“--compress”、“2”、“--no-header-files”、“--no-”之类的标签man-pages' ,创建一个大约 45mb 的分发文件夹。

如果我们想使用javapackager,比如创建一个.DMG文件,我们如何做类似的压缩?因为这些标签不适用于 javapackager。没有它们,最终的包大约是 100mb,失去了很多 java9 模块化优势,所以我的问题是是否可以将 javapackager 与 jlink 创建的 JRE 运行时映像一起使用。

谢谢

回答我自己的问题,我们可以使用两者的组合:

对于 MacOSX 示例:

1) 使用 jlink 生成运行时 dist,如果使用压缩标签,这将创建一个大约 50mb 的 lib 文件夹。

2) 使用 javapackager 生成 MacOSX.app,此 .app 将附带一个大约 98mb 的运行时库文件夹。

3) 简单替换,右击MacOSX.app-> "show package contents",然后进入Plugins/Java.runtime/Contents/Home/,将lib文件夹替换为生成的lib文件夹jLink.

这样你就有了一个独立的 Java 应用程序,大约 50mb 而不是 100mb,多亏了漂亮的 Java9 个模块。

仅使用 javapackager 完成所有这些工作会很酷,如果可能的话我找不到方法,我建议使用类似 gradle 的东西通过 1 个命令执行所有这些过程。

您可以将选项传递给 JDK 9 javapackager 传递给 jlink 进程。

控制jlink的javapackager选项

-BjlinkOptions=compress=2
or
-BjlinkOptions=strip-debug

我不知道如何同时通过。

-BjlinkOptions="compress=2 strip-debug"

导致 java.lang.IllegalArgumentException

-BjlinkOptions="strip-debug compress=2"

-BjlinkOptions=strip-debug

的结果相同

When the option -BjlinkOptions=... is passed multiple times to javapackager, only the last one is taken into account.

jlink 选项 no-header-filesno-man-pages 在这里似乎无效,因为它们在 -BjlinkOptions= 之后传递时会导致 NPE。