jlink定制精简JRE的核心是依赖分析而非手动删减:先用jdeps精准识别应用所需模块(如java.base、java.logging),再通过jlink --module-path $JAVA_HOME/jmods --add-modules 指定模块自动生成最小闭包运行时,配合--strip-debug、--compress=2等参数优化体积与启动性能。

Java 利用 jlink 自定义精简 JRE,核心是“按需打包模块”,不是手动删文件,而是让工具自动计算依赖闭包,生成最小可用运行时。JDK 9+ 模块化后,jlink 成为官方推荐的标准方式,既减体积、降内存,又提升启动速度。
先查清你的程序真正依赖哪些模块
盲目加模块容易带入冗余,漏模块则运行时报错。必须用 jdeps 分析:
- 对 jar 包执行:
jdeps --class-path your-app.jar your.main.Class,输出直接/间接依赖的模块名(如java.base、java.xml、java.net.http) - 加
--jdk-internals检查是否误用了内部 API(比如sun.misc.Unsafe),这类调用在精简 JRE 中大概率失败 - 非模块化项目建议加上
--multi-release 17(按目标 JDK 版本解析多版本 class),结果更准
用 jlink 构建最小运行时镜像
jlink 不处理你的代码,只从 $JAVA_HOME/jmods 读取模块定义,生成可执行目录:
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
- 基础命令:
jlink --module-path $JAVA_HOME/jmods --add-modules java.base,java.logging --output myjre - 常见组合参考:
– 命令行工具:至少java.base+java.logging+java.net.http
– 含 XML 解析(如 Apktool):补上java.xml
– 含 GUI 或图像操作:加java.desktop
– Spring 类框架(反射/代理):通常需要java.management或java.instrument - 关键优化参数:
--strip-debug(去调试符号)、--compress=2(压缩类字节码)、--no-header-files --no-man-pages(去开发文档)
验证精简 JRE 是否真正可用
生成后不能直接打包上线,必须实测:
立即学习“Java免费学习笔记(深入)”;
- 进入
myjre/bin目录,运行:./java --list-modules,确认所需模块都在列表中 - 用新 JRE 启动你的应用:
./java -jar your-app.jar,观察是否报NoClassDefFoundError或Module not found - 若失败,回看
jdeps输出,或临时扩大--add-modules范围(比如加上java.sql或jdk.unsupported),再重试
后续集成与部署建议
精简 JRE 可直接嵌入分发包,无需用户额外安装:
- 配合 Launch4j、jpackage 等工具打包成 Windows/macOS/Linux 原生可执行文件
- 在 Docker 中作为基础镜像层:
COPY myjre /opt/java/jre,比用完整 JDK 镜像小 5–10 倍 - 体积典型值:纯控制台应用可压到 30–50MB;含桌面支持约 70–90MB;再用 7z 压缩后常低于 20MB

















