在将 Java 项目部署到生产服务器时,理解 JDK(Java Development Kit) 和 JRE(Java Runtime Environment) 的区别至关重要,因为这直接影响服务器资源占用、安全性、维护成本和部署复杂度。
✅ 核心区别简述
| 特性 | JRE(Java Runtime Environment) | JDK(Java Development Kit) |
|---|---|---|
| 用途 | 仅用于运行 Java 程序 | 用于开发 + 运行 Java 程序 |
| 包含内容 | JRE + JVM + 核心类库 | JDK = JRE + 编译器(javac)、调试工具(jdb)、打包工具(jar)等 |
| 体积 | 较小(通常 ~10–30 MB) | 较大(通常 ~200–500 MB+) |
| 是否适合生产环境 | ✅ 推荐 | ❌ 不推荐(除非特殊需求) |
| 安全性 | 更安全(无编译工具,攻击面小) | 风险较高(含开发工具,可能被滥用) |
| 许可证 | 通常免费或宽松 | 部分版本需商业许可(如 Oracle JDK 8u161+) |
🚀 为什么生产环境推荐使用 JRE?
1. 最小化攻击面
- JDK 包含
javac、javadoc、jdb等开发工具。 - 如果服务器被入侵,攻击者可能利用这些工具进行二次编译、注入恶意代码或提权。
- JRE 仅提供运行时能力,无法编译新代码,显著降低安全风险。
2. 节省磁盘空间和内存
- JRE 比 JDK 小得多,尤其在容器化部署(如 Docker)中,镜像体积更小,启动更快,传输更高效。
- 示例:一个基于 OpenJDK 17 的 JRE 基础镜像约 150 MB,而 JDK 基础镜像超过 400 MB。
3. 符合“最小权限原则”
- 生产服务器应只安装必要的组件。
- 运行 Java 应用只需 JRE,无需编译或调试工具。
4. 合规与许可证问题
- Oracle JDK 自 8u161 起对商业用途有许可限制。
- OpenJDK 是开源替代品,但同样建议在生产中使用精简的 JRE 发行版(如 Adoptium Temurin、Amazon Corretto)。
⚠️ 什么情况下生产环境可以使用 JDK?
虽然不推荐,但在以下场景中可能不得不使用 JDK:
| 场景 | 说明 |
|---|---|
| 动态加载/热替换 | 某些框架(如 Spring Boot DevTools)在运行时重新编译类(仅限开发测试环境) |
| 自定义构建流程 | 服务器本身参与构建过程(如 CI/CD 节点),但这属于运维基础设施,不应视为“纯生产” |
| 遗留系统依赖 | 老旧应用意外依赖 JDK 中的内部 API(如 sun.* 包),迁移成本高 |
| 调试排查困难 | 紧急故障排查时临时需要 jstack、jmap 等工具(但这些工具在 JRE 中也存在!) |
💡 注意:许多诊断工具(如
jps,jstat,jmap,jstack)实际上在 JRE 中也包含,因为它们属于 JVM 自带的命令行工具,并非 JDK 独有。真正缺失的是javac、javadoc等开发工具。
✅ 最佳实践建议
-
生产环境始终使用 JRE
选择轻量级、长期支持(LTS)的 JRE 发行版,例如:- Eclipse Temurin(原 AdoptOpenJDK)
- Amazon Corretto
- Alibaba Dragonwell
-
使用容器化部署时,选用
-slim或-jre基础镜像# 推荐:仅包含 JRE FROM eclipse-temurin:17-jre-alpine COPY target/myapp.jar /app/myapp.jar ENTRYPOINT ["java", "-jar", "/app/myapp.jar"] -
避免在服务器上安装完整 JDK
即使你本地开发用 JDK,也应确保生产服务器只部署 JRE。 -
定期更新 JRE 版本
及时修补安全漏洞(如 CVE),优先选择 LTS 版本。
🔍 补充:JDK/JRE/JVM 关系图
JDK(开发套件)
├── JRE(运行环境)
│ ├── JVM(虚拟机)
│ └── 核心类库(rt.jar, jmods 等)
└── 开发工具(javac, jar, javadoc, jdb 等)
JVM 是实际执行字节码的引擎,无论是 JDK 还是 JRE,都包含同一个 JVM。区别在于额外提供的工具链。
✅ 总结
| 问题 | 答案 |
|---|---|
| 生产服务器该装 JDK 还是 JRE? | JRE |
| JRE 能运行所有 Java 应用吗? | ✅ 是的,只要应用已编译成 .class 或 .jar |
| JDK 中的哪些工具 JRE 没有? | javac, javadoc, jar(打包工具在某些 JRE 中也可能缺失,但主流发行版仍保留) |
| 如何确认当前环境是 JRE 还是 JDK? | 运行 java -version 和 javac -version,若后者报错则为 JRE |
📌 结论:为了安全、高效、合规,生产服务器应始终部署 JRE,而非 JDK。仅在极少数特殊场景下才考虑使用 JDK,并需经过严格的安全评估。
云知识CLOUD