目录
- 前置
- [1. 使用 jlink 创建自定义运行时镜像](#1. 使用 jlink 创建自定义运行时镜像)
- [2. 使用jpackage打包并嵌入自定义JRE](#2. 使用jpackage打包并嵌入自定义JRE)
前置
注意最好采用普通打包,即不要使用repackage打成fat jar, 因为jpackage识别不了fat jar包的内部结构. pom.xml中相关改动示意如下:

1. 使用 jlink 创建自定义运行时镜像
jlink 是 JDK 9 引入的一个重要工具,可根据指定的模块列表,创建自定义的 Java 运行时镜像,只包含应用程序实际需要的 Java 模块,减少运行时体积。
1.1 打包需要的最小运行时环境:
先运行 jdeps 命令来分析JAR包所依赖的JDK模块 :
。。。\jdk-17\bin\jdeps --list-deps --multi-release 17 --ignore-missing-deps D:\造物云换脸\vision-backend\target\vision-backend-0.0.1-SNAPSHOT.jar D:\造物云换脸\vision-backend\target\libs\WIN64\*.jar D:\造物云换脸\vision-backend\target\libs\*.jar
[1](#1)
因为返回了:
java.base
java.desktop
所以有:
。。。\jdk-17\bin\jlink --module-path D:\Java\jdk-17/jmods --add-modules java.base,java.desktop --output my-jre --compress 2 --no-header-files --no-man-pages
1.2 打包整个jdk:
。。。\jdk-17\bin\jlink --module-path D:\Java\jdk-17/jmods --add-modules ALL-MODULE-PATH --output my-complete-jre --compress 2 --no-header-files --no-man-pages
1.3 使用 java.se 聚合模块打包:
JDK 提供了 java.se 模块,它聚合了 Java SE 标准规范的所有模块。
。。。\jdk-17\bin\jlink --module-path D:\Java\jdk-17/jmods --add-modules java.se --output my-jre --compress 2 --no-header-files --no-man-pages
在项目实践中,我发现java.se模块不够用,比如fastjson会报java.lang.ExceptionInInitializerError: Exception com.alibaba.fastjson2.JSONException: init unsafe error 。我对fastjson包进行jdeps发现它依赖jdk.unsupported模块
2. 使用jpackage打包并嵌入自定义JRE
。。。\jdk-17\bin\jpackage --type app-image --input D:\造物云换脸\vision-backend\target/ --main-jar vision-backend-0.0.1-SNAPSHOT.jar --main-class com.zju.design.visionbackend.ui.MainApp --runtime-image D:\造物云换脸\vision-backend\my-complete-jre --name 智能大屏 --java-options "-DbuiltIn.exeForm=true -Dfile.encoding=UTF-8 -cp D:\造物云换脸\vision-backend\target\vision-backend-0.0.1-SNAPSHOT.jar;D:\造物云换脸\vision-backend\target\libs/*"
jpackage参数说明:
| 参数 | 说明 |
|---|---|
| --type app-image | 生成文件夹版,无需WiX ^[2](#参数 说明 –type app-image 生成文件夹版,无需WiX 2 –input Jar包所在目录 –runtime-image 内置JRE –icon 可选:去掉则用默认Java图标 –win-console 显示控制台, 默认不显示 –java-options “-Xmx512m -XX:+UseG1GC” 可选:JVM参数(如最大堆512MB,优化启动))^ |
| --input | Jar包所在目录 |
| --runtime-image | 内置JRE |
| --icon | 可选:去掉则用默认Java图标 |
| --win-console | 显示控制台, 默认不显示 |
| --java-options "-Xmx512m -XX:+UseG1GC" | 可选:JVM参数(如最大堆512MB,优化启动) |