You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

jpackage打包体积远超预期如何缩小?是否必须配合jlink使用?

体积过大的核心原因
  • 非模块化应用无模块依赖声明:你没有给jpackage提供明确的JDK模块依赖列表时,jpackage无法自动裁剪非模块化应用的JDK依赖,会默认将完整JDK运行时全部打包进镜像,这就是runtime/lib/modules文件过大、存在大量未使用模块legal文件的根本原因。
  • --jlink-options参数限制:jpackage设计上禁止在--jlink-options中传入--add-modules参数,该参数属于jpackage的顶层可控参数,因此你之前的参数写法会触发报错。
无需改模块化、无需提前调用jlink的优化方案

你可以直接通过jpackage自带的顶层参数实现运行时裁剪,操作步骤如下:

  1. 扫描应用实际依赖的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,复制该结果备用。

  1. 调整生成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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.30 17:45:00