jpackage打包体积远超预期如何缩小?是否必须配合jlink使用?
体积过大的核心原因
- 非模块化应用无模块依赖声明:你没有给jpackage提供明确的JDK模块依赖列表时,jpackage无法自动裁剪非模块化应用的JDK依赖,会默认将完整JDK运行时全部打包进镜像,这就是
runtime/lib/modules文件过大、存在大量未使用模块legal文件的根本原因。 --jlink-options参数限制:jpackage设计上禁止在--jlink-options中传入--add-modules参数,该参数属于jpackage的顶层可控参数,因此你之前的参数写法会触发报错。
无需改模块化、无需提前调用jlink的优化方案
你可以直接通过jpackage自带的顶层参数实现运行时裁剪,操作步骤如下:
- 扫描应用实际依赖的JDK模块
使用JDK自带的jdeps工具直接扫描你的应用jar(如果有第三方依赖需要一并加入classpath),命令示例:
# 无第三方依赖的情况 jdeps --print-module-deps target\jar\myapp.jar # 存在第三方依赖的情况,将lib目录替换为你的依赖存放路径 jdeps --print-module-deps --class-path "target\jar\lib\*" target\jar\myapp.jar
执行后会输出逗号分隔的模块列表,比如java.base,java.desktop,java.prefs,复制该结果备用。
- 调整生成app镜像的jpackage参数
在你原有的第一个jpackage命令中,添加两个配置:
- 顶层的
--add-modules参数,传入刚才扫描得到的模块列表 - 在
--jlink-options中加入裁剪优化参数(这几个参数是允许传入的)
调整后的完整参数示例:
--type app-image --name myapp --dest target\appimg --temp target\appimg-work --input target\jar --icon .\icon.ico --main-jar target\jar\myapp.jar --main-class com.msgprograms.myapp.AppMain # 新增的裁剪参数 --add-modules java.base,java.desktop,java.prefs --jlink-options "--strip-debug --no-man-pages --no-header-files --compress=2"
上述配置优化后,生成的app镜像体积会和你之前用jlink生成的40MB左右的镜像大小基本一致,不需要改动你的应用代码为模块化结构,也不需要提前单独执行jlink生成运行时。
内容的提问来源于stack exchange,提问作者mindoverflow
相关产品推荐
相关产品推荐

