生产环境应使用最小化 Java 运行时:Java 11+ 推荐用 jlink 构建自定义运行时镜像,Java 8 则选用 Temurin 或 Corretto 的官方 JRE;容器中优先采用 eclipse/temurin:x-jre-jammy 等精简镜像。

只装 JRE 而非 JDK,是 Java 最小化部署的前提
服务器上运行 Java 应用(如 Spring Boot 打包的 jar 文件)根本不需要编译器、调试器、javac 或源码工具。装完整 JDK 属于资源浪费,还可能引入安全风险(比如暴露 jconsole、jstatd 等管理端口)。必须明确:生产环境只要 JRE —— 更准确地说,从 Java 11 开始,官方已不再单独发布 JRE,取而代之的是通过 jlink 构建自定义运行时镜像。
Java 11+ 推荐用 jlink 构建最小化运行时
jlink 是 JDK 自带的工具,能从模块化 JDK 中裁剪出仅含应用所需模块的轻量级运行时。它比传统 JRE 小 50% 以上,且无冗余组件(如 javaws、policytool),启动更快、攻击面更小。
- 先确认你的应用依赖哪些模块:常见如
java.base、java.desktop(若用 AWT/Swing)、java.sql(用 JDBC)、java.xml(解析 XML)等;Spring Boot 应用通常只需java.base+java.logging+java.naming+java.desktop(仅当用到java.awt.Toolkit等) - 执行命令生成运行时:
jlink --module-path $JAVA_HOME/jmods \ --add-modules java.base,java.logging,java.naming,java.desktop \ --output /opt/myapp-jre \ --strip-debug \ --compress=2 \ --no-header-files \ --no-man-pages
- 验证是否可用:
/opt/myapp-jre/bin/java -version
和/opt/myapp-jre/bin/java -cp myapp.jar MainClass
- 注意:
--strip-debug和--compress=2能进一步减小体积;--no-header-files和--no-man-pages对服务器完全无用,务必关闭
Java 8 及更早版本只能用官方 JRE 或手动删减
Java 8 仍提供独立 JRE 下载(如 jre-8u391-linux-x64.tar.gz),这是最稳妥选择。但要注意:
- Oracle 官方 JRE 已停止更新(2019 年起),必须改用 Adoptium(Eclipse Temurin)或 Amazon Corretto 的长期支持版 JRE
- 不要解压后手动删
bin/下的javaws、policytool等 —— 这些二进制文件可能被动态加载或触发安全检查,删了会导致UnsatisfiedLinkError或启动失败 - Temurin 不再提供 JRE 下载,需下载完整 JDK 后用
jlink(即使 Java 8 的jlink功能有限,也比手动删安全)
容器场景下直接用 eclipse/temurin:17-jre-jammy 等精简镜像
Docker 用户别自己折腾 tar 包。Temurin 官方维护的 -jre- 后缀镜像就是为最小化设计的,底层基于 Ubuntu Jammy 或 Debian Bookworm,不含 javac、jdk.* 模块,体积通常在 120–150MB(对比 full-jdk 镜像 350MB+)。
立即学习“Java免费学习笔记(深入)”;
- 写法示例:
FROM eclipse/temurin:17-jre-jammy COPY myapp.jar /app.jar ENTRYPOINT ["/opt/java/openjdk/bin/java", "-jar", "/app.jar"]
- 避免用
openjdk:17-slim—— 它仍是 JDK,包含javac和所有 jmods,只是去掉了 man pages 和 docs - 如果应用用到了
javax.crypto.*,确认镜像中crypto.policy未被锁死(Temurin 默认允许 unlimited policy)
jlink 是现代 Java 最小化的事实标准,但它的模块列表必须按真实依赖推导,不能凭经验硬写;容器镜像看似省事,但得盯紧基础镜像的更新节奏和 TLS/加密策略变更。










