在将 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)、监控工具等 |
| 是否包含 JVM | ✅ 是 | ✅ 是(通过 JRE 包含) |
| 是否包含 javac | ❌ 否 | ✅ 是 |
| 体积大小 | 较小 | 较大 |
| 适合场景 | 生产环境运行应用 | 开发/测试环境 |
三、部署生产环境时的选择
✅ 推荐:使用 JRE 或更精简的运行时(如 JRE 或 JLink 打包的运行时)
- 在生产环境中,你的 Java 应用通常是已经编译好的
.class文件或打包成的.jar/.war文件。 - 此时你不需要编译源代码,因此 不需要
javac等开发工具。 - 使用 JRE 足以运行程序,且:
- 占用磁盘空间更小
- 安全性更高(减少攻击面)
- 更轻量,启动更快
⚠️ 实际上,从 Java 11 开始,Oracle 不再提供独立的 JRE 下载。Java SE 的发行版默认是 JDK,但你可以从中提取或使用工具生成最小化运行时。
四、现代实践建议(Java 11+)
方案 1:使用 JDK 镜像,但只运行不开发
- 很多生产部署仍然使用完整的 JDK,因为:
- Docker 镜像中常用
openjdk:17-jdk-alpine或类似镜像 - 便于排查问题(可使用
jstack,jmap,jcmd等诊断工具)
- Docker 镜像中常用
- 优点:运维调试方便
- 缺点:占用稍大
方案 2:使用 jlink 创建自定义最小运行时
jlink --add-modules java.base,java.logging,java.xml --output myjre
- 生成一个只包含所需模块的最小化运行时环境
- 显著减小体积,适合容器化部署
方案 3:使用 JRE 替代品(如 Adoptium 提供的 JRE 构建)
- 社区项目(如 Eclipse Adoptium)仍提供 JRE 构建版本
- 可直接下载
jre版本用于部署
五、总结:生产环境用 JDK 还是 JRE?
| 情况 | 建议 |
|---|---|
| 纯粹运行已编译的 Java 应用 | ✅ 使用 JRE 或最小化运行时(推荐) |
| 需要运行时诊断、监控、调试 | ✅ 使用 JDK(实用性强) |
| 容器化部署追求最小镜像 | ✅ 使用 jlink 生成定制运行时 |
| Java 8 环境 | 可直接下载独立 JRE |
| Java 11+ 环境 | JDK 成为主流分发形式,但可裁剪 |
六、常见误区
❌ “生产必须用 JRE,不能用 JDK”
✅ 错!很多企业生产环境使用 JDK,主要是为了方便使用 jps, jstack, jstat 等工具进行性能调优和故障排查。
❌ “JDK 包含 JRE,所以更慢”
✅ 错!运行速度完全一样,因为都使用同一个 JVM。只是磁盘和内存占用略高。
结论:
生产部署时,如果不需要开发功能,优先选择 JRE 或最小化运行时;但如果需要运维诊断能力,使用 JDK 也是合理且常见的选择。
根据实际需求权衡 安全性、体积、运维便利性 来决定即可。
CLOUD云枢