带有jlink压缩标记的Java9打包程序

时间:2017-11-14 13:45:40

标签: java java-9 jigsaw jlink javapackager

当我们创建jlink运行时映像时,我们可以使用标签,例如' - strip-debug',' - compress',' 2',&# 39; - no-header-files',' - no-man-pages' ,创建一个45mb左右的分发文件夹。

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

感谢

2 个答案:

答案 0 :(得分:4)

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

对于MacOSX示例:

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

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

3)简单替换它们,右键单击MacOSX.app-> “show package contents”,然后转到Plugins / Java.runtime / Contents / Home /并将lib文件夹替换为jLink生成的文件夹。

这样你就有了一个自包含的Java应用程序,大约50mb而不是100mb,这要归功于漂亮的Java9模块。

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

答案 1 :(得分:4)

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

控制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

的结果相同

当选项-BjlinkOptions=...多次传递给javapackager时,只考虑最后一个。

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