生产环境应使用jlink构建的自定义模块化运行时(Java 11+)或官方JRE镜像(Java 8),而非手动删减JDK;jlink是唯一合规裁剪方式,需显式分析依赖并添加--strip-debug等参数优化体积。

生产环境应该使用精简运行时,而不是完整 JDK —— 但这个“精简运行时”不是手动删文件得来的,也不是 Java 8 那种独立 JRE,而是用 jlink 构建的自定义模块化镜像(Java 11+)或选用官方维护的 JRE 镜像(Java 8)。
Java 11+ 必须用 jlink 构建最小运行时
从 Java 9 开始,Oracle 和主流 OpenJDK 发行版(Temurin、Corretto、Zulu)已停止发布独立 JRE。你下载到的所谓 “JDK” 压缩包里不再带 jre/ 目录,java 命令直接来自 $JAVA_HOME/bin,背后是模块化 JVM。此时,“只运行不开发”的唯一合规路径就是 jlink。
-
jlink不是可选工具,它是 JDK 自带的、专为裁剪设计的官方机制;手动删bin/下的javac、jconsole等会导致类加载失败或UnsatisfiedLinkError - 常见误判:执行
java -version输出含OpenJDK Runtime Environment就以为是“JRE”——其实只是字符串描述,底层仍是完整 JDK 模块集 - 必须显式分析依赖:Spring Boot 应用通常只需
java.base、java.logging、java.naming、java.desktop(仅当调用Toolkit.getDefaultToolkit()时);漏掉java.sql会导致 JDBC 驱动初始化失败 - 构建命令中
--strip-debug和--compress=2能减少 30% 体积,--no-header-files和--no-man-pages在服务器上毫无作用,必须加上
Java 8 及更早版本只能用官方 JRE 或 Temurin/Corretto 的 LTS JRE
Java 8 仍提供独立 JRE 下载(如 jre-8u391-linux-x64.tar.gz),但 Oracle 官方已于 2019 年停止更新。现在必须改用 Eclipse Temurin 或 Amazon Corretto 的长期支持版 JRE。
- Temurin 官网已不提供 JRE 下载链接,需下载完整 JDK 包后用
jlink构建(即使 Java 8 的jlink功能有限,也比手动删安全) - Corretto 提供明确标注的
corretto-8.jreRPM 包,适合 CentOS/RHEL 系统,安装后which javac返回空,java -version显示Corretto-8.392.08.1+Runtime Environment - 不要解压 JDK 后进
bin/目录删javaws、policytool—— 这些二进制可能被内部 JNI 调用,删了会触发安全校验失败
容器场景下直接用 eclipse/temurin:x-jre-jammy 等镜像
在 Docker/Kubernetes 环境中,jlink 构建虽精准,但增加 CI 构建复杂度。更推荐直接拉取官方维护的 JRE 镜像,例如 eclipse/temurin:17-jre-jammy。
- 这些镜像体积比对应 JDK 镜像小 50% 以上(如 17-jre-jammy ≈ 120MB,17-jdk-jammy ≈ 280MB),且不含
javac、javadoc、jshell等非运行必需组件 - 镜像内预装的
java是经验证可运行 Spring Boot、Quarkus 等主流框架的最小集合,无需额外jlink步骤 - 注意标签命名:带
-jre-的才是精简镜像;-jdk-标签哪怕只运行 jar,也会引入冗余攻击面(如暴露jstatd默认端口) - ARM64(
aarch64)平台需严格匹配镜像架构,eclipse/temurin:17-jre-jammy有 aarch64 多架构支持,但openjdk:17-jre-slim可能只有 amd64
真正容易被忽略的点是:精简不是目标,可控才是。无论用 jlink 还是 JRE 镜像,核心在于确保模块列表可审计、启动参数可复现、升级路径可回滚。临时加个 java.desktop 模块让日志图标显示出来,可能就悄悄引入 AWT 依赖和 X11 连接风险——这种细节,往往在压测阶段才暴露。


















