在将 Java 项目部署到生产服务器时,理解 JDK 和 JRE 的区别非常重要,这关系到你选择安装哪个工具包以及是否满足运行或开发需求。
一、基本定义
| 名称 | 全称 | 中文含义 |
|---|---|---|
| JRE | Java Runtime Environment | Java 运行时环境 |
| JDK | Java Development Kit | Java 开发工具包 |
二、核心区别
| 特性 | JRE | JDK |
|---|---|---|
| 用途 | 只用于运行 Java 程序 | 用于开发和运行 Java 程序 |
| 包含内容 | JVM + 核心类库(如 java.lang, java.util 等) | JRE + 编译器(javac)、调试器(jdb)、打包工具(jar)、文档生成工具(javadoc)等开发工具 |
| 能否编译代码 | ❌ 不能 | ✅ 能 |
| 体积大小 | 较小 | 较大 |
| 适合场景 | 生产环境运行应用 | 开发/测试环境 |
三、部署生产环境时的选择
✅ 推荐:使用 JRE 或 仅 JVM
- 在生产环境中,你的 Java 应用通常是以 编译好的
.class文件 或 打包成的.jar/.war文件 形式存在的。 - 此时你只需要一个 运行环境 来启动和运行程序,不需要编译、调试等开发功能。
- 因此,理论上只需安装 JRE 即可。
⚠️ 注意:从 Java 11 开始,Oracle 不再提供独立的 JRE 下载。JDK 是最小可部署单元,但你可以通过
jlink工具创建自定义运行时镜像,只包含所需模块,从而减小体积。
四、实际生产部署建议(Java 8 vs Java 11+)
| Java 版本 | 建议 |
|---|---|
| Java 8 | 可以只安装 JRE,节省空间;但很多企业仍装 JDK 便于排查问题(如使用 jstack、jstat) |
| Java 11 及以上 | 官方不再提供独立 JRE,必须安装 JDK,但可通过 jlink 创建轻量级运行时环境 |
# 示例:使用 jlink 创建最小运行时
jlink --add-modules java.base,java.logging --output myjre
然后使用 myjre/bin/java 来运行程序,相当于一个定制版“JRE”。
五、生产环境常见做法
-
安装完整 JDK
- 虽然略重,但便于使用诊断工具(如
jps,jstack,jmap)分析性能、内存泄漏等问题。 - 实际上大多数生产服务器还是会装 JDK,而非仅 JRE。
- 虽然略重,但便于使用诊断工具(如
-
使用容器化(Docker)优化
- 使用精简的基础镜像,如:
FROM eclipse-temurin:17-jre-alpine - 这类镜像基于 JRE 或使用 jlink 构建,体积小,安全性高。
- 使用精简的基础镜像,如:
六、总结
| 问题 | 回答 |
|---|---|
| 生产环境需要 JDK 还是 JRE? | 仅运行程序 → JRE 足够;但从 Java 11 起推荐安装 JDK 或使用 jlink 生成的运行时 |
| 是否可以只装 JRE? | Java 8 可以;Java 11+ 不再提供独立 JRE |
| 为什么生产环境常装 JDK? | 便于故障排查(使用 jstack、jmap 等工具) |
| 最佳实践? | 使用 JDK 或定制运行时(jlink),结合监控工具,确保可维护性与性能平衡 |
✅ 结论:
在现代 Java 部署中,即使只是运行程序,也普遍在生产服务器上安装 JDK,以便具备完整的诊断能力。但从资源角度,使用 JRE 或自定义运行时更高效,尤其是在容器化环境中。
云服务器