JPackage导出部署:非模块化程序缩减runtime文件夹体积方法
核心思路
默认jpackage会打包完整的Java Runtime Environment(JRE),我们可以通过生成仅包含程序依赖模块的自定义Runtime来大幅缩减体积,无需深入模块开发知识,只需三步完成:分析依赖模块 → 生成自定义Runtime → 用jpackage指定该Runtime。
步骤1:用jdeps分析程序依赖的模块
jdeps是JDK自带的工具,能自动分析Jar包依赖的Java模块。打开命令提示符(CMD),切换到program.jar所在目录,运行以下命令:
jdeps --list-deps program.jar
执行后会输出类似这样的模块列表(以Swing+Excel导出场景为例):
java.base java.desktop java.logging java.sql
注:如果你的Excel导出库是模块化的,会直接列出对应模块;如果是非模块化Jar,jdeps会自动处理,只需把输出的所有模块记录下来即可。
步骤2:用jlink生成自定义Runtime镜像
用jlink工具基于上面的模块列表,生成仅包含必要组件的Runtime。运行以下命令(替换<模块列表>为你刚才得到的模块,多个模块用逗号分隔):
jlink ^ --output "C:\Users\Anon\Desktop\custom-jre" ^ --add-modules java.base,java.desktop,java.logging,java.sql ^ --strip-debug ^ --compress 2 ^ --no-header-files ^ --no-man-pages
参数说明:
--output:指定自定义Runtime的输出目录--add-modules:指定要包含的核心模块(从jdeps结果复制)--strip-debug:移除调试信息,减少体积--compress 2:采用最高压缩级别压缩模块--no-header-files/--no-man-pages:移除头文件和手册,进一步缩减体积
执行完成后,custom-jre目录的体积会远小于完整JRE(通常能降到30-50MB左右,具体取决于依赖模块数量)。
步骤3:修改jpackage命令,使用自定义Runtime
在原有jpackage命令基础上,添加--runtime-image参数指向我们生成的自定义Runtime,命令如下:
jpackage ^ --type app-image ^ --input "C:\Users\Anon\Desktop\input" ^ --dest "C:\Users\Anon\Desktop\output" ^ --app-version 1.0 ^ --name "Billing System" ^ --main-jar "program.jar" ^ --main-class com.billingsystem.BillingProgram ^ --runtime-image "C:\Users\Anon\Desktop\custom-jre"
运行该命令后,生成的Billing System应用镜像体积会大幅降低,Runtime部分只会包含程序真正需要的组件。
额外适配技巧
如果你的Excel导出库是非模块化的(比如旧版本POI),jdeps可能会提示unnamed module,此时可以修改jlink命令,通过--module-path指定依赖Jar路径,同时用ALL-MODULE-PATH自动包含所有依赖模块:
jlink ^ --output "C:\Users\Anon\Desktop\custom-jre" ^ --add-modules java.base,java.desktop,ALL-MODULE-PATH ^ --module-path "C:\Users\Anon\Desktop\input\lib\*" ^ --strip-debug ^ --compress 2 ^ --no-header-files ^ --no-man-pages
(假设你的依赖Jar都存放在input/lib目录下)
若要生成Windows安装程序(而非app-image),只需将--type app-image替换为--type exe即可,其他参数保持不变。
内容的提问来源于stack exchange,提问作者Anonymous

