在服务器部署 Java 应用时,JRE(Java Runtime Environment)和 JDK(Java Development Kit)的核心区别在于用途和包含内容。选择哪一个取决于你的具体部署场景:
✅ 1. JRE(Java 运行时环境)
- 定位:仅用于运行已编译的 Java 程序(
.class或.jar文件)。 - 包含内容:
- JVM(Java 虚拟机)——真正执行字节码的引擎;
- 核心类库(如
java.lang,java.util,java.io等); - 运行时支持工具(如
java,jexec,keytool,jjs等基础命令); - ❌ 不包含编译器(
javac)、调试器(jdb)、打包工具(jar,javadoc)、性能分析工具(jstat,jstack,jmap)等开发相关组件。
- 适用场景(推荐用于生产环境):
- 应用已提前在开发/构建环境编译完成(如 Maven 打包生成的
app.jar); - 服务器只需运行该 JAR/WAR(如 Spring Boot 的 fat jar、Tomcat 中部署的 WAR);
- 追求最小化、安全性、资源占用低(JRE 体积更小,攻击面更小)。
- 应用已提前在开发/构建环境编译完成(如 Maven 打包生成的
✅ ✅ 最佳实践:生产服务器应优先安装 JRE(或更现代的 JRE 替代品,见下文)
✅ 2. JDK(Java 开发工具包)
- 定位:面向开发与构建,是 JRE + 开发工具的超集。
- 包含内容:
- ✅ 完整的 JRE(含 JVM 和类库);
- ✅
javac(Java 编译器); - ✅
javadoc,jar,jdeps,jlink,jpackage等构建/打包工具; - ✅ 调试与诊断工具:
jdb,jstat,jstack,jmap,jconsole,jvisualvm(部分版本); - ✅ 源代码(
src.zip)、头文件(JNI 开发用)、Java 本地接口(JNI)支持等。
- 适用场景:
- 服务器需动态编译 Java 代码(如某些老式 JSP 容器、Groovy/Scala 脚本热编译、或自定义类加载+编译场景);
- 需要在服务器端进行故障诊断与性能调优(如实时 dump 堆栈、内存快照、GC 分析);
- 构建环境(CI/CD Agent、Docker 构建阶段);
- ⚠️ 不推荐作为生产运行时(除非有明确需求),因为:
- 体积更大(多出 50–100MB+);
- 包含非必要组件,增加安全风险(如
jcmd可被滥用); - 不符合“最小权限”原则。
🔍 关键补充说明(重要!)
| 方面 | 说明 |
|---|---|
| JDK 自带 JRE? | ✅ 是的 —— JAVA_HOME/jre/(旧版 JDK 8)或 JAVA_HOME/bin/java 直接指向运行时(JDK 9+ 移除了独立 jre/ 目录,但 java 命令仍可用)。JDK 本质就是“可运行 + 可开发”的完整套件。 |
| 现代 Java(JDK 11+)的“JRE”去哪了? | ❗ Oracle 和 OpenJDK 自 JDK 11 起正式移除了独立 JRE 下载。官方推荐: • 生产环境 → 使用 JDK + jlink 构建自定义最小运行时镜像(仅含应用所需模块);• 或直接使用 JDK 并只运行 java 命令(无 javac 等工具不会自动启用);• 第三方提供轻量 JRE(如 Eclipse Temurin JRE、Amazon Corretto JRE —— 注意确认是否仍维护)。 |
| Docker 场景建议 | • 构建阶段用 eclipse-temurin:17-jdk-jammy;• 运行阶段用 eclipse-temurin:17-jre-jammy(若提供)或更优:eclipse-temurin:17-jdk-jammy + jlink 构建精简镜像(或直接用 jdk-slim 镜像并确保不暴露开发工具)。 |
| 安全与合规 | 政企环境中常要求“运行环境不含编译器”,以防止恶意代码注入后动态编译执行(如反序列化漏洞利用链)。此时 JRE 或 jlink 定制镜像是刚需。 |
✅ 总结:一句话决策指南
| 场景 | 推荐 |
|---|---|
| 🟢 标准生产部署(Spring Boot JAR / Tomcat WAR) | ✅ JRE(或 JDK + 严格权限管控 + 不用开发工具); 更佳:用 jlink 构建最小化运行时镜像(JDK 11+) |
🟡 需要线上诊断(如频繁 jstack/jmap) |
✅ JDK(确保运维人员有权限且流程受控) |
| 🔴 服务器上编译 Java 源码(非常规!) | ✅ JDK(但应反思架构设计——编译应在 CI 完成) |
| 🐳 容器化部署 | ✅ 多阶段构建:build stage 用 JDK,runtime stage 用 jre 或 jlink 镜像 |
如需,我可以为你提供:
- ✅
jlink构建最小运行时的完整命令示例(适配 Spring Boot); - ✅ Dockerfile 多阶段构建模板;
- ✅ 各主流发行版(Temurin / Corretto / Zulu)的 JRE/JDK 下载指引;
- ✅ 如何验证服务器上是否意外暴露了
javac等高危工具。
欢迎继续提问 😊
云服务器