在服务器部署 Java 应用时,JRE(Java Runtime Environment) 和 JDK(Java Development Kit) 的主要区别在于它们的用途和包含的内容。以下是详细的对比:
一、基本定义
| 名称 | 全称 | 作用 |
|---|---|---|
| JRE | Java Runtime Environment | 提供运行 Java 程序所需的环境 |
| JDK | Java Development Kit | 提供开发和运行 Java 程序所需的全套工具 |
二、核心区别
| 对比项 | JRE | JDK |
|---|---|---|
| 用途 | 仅用于运行已编译的 Java 程序(.class 文件) |
用于开发、编译、调试和运行 Java 程序 |
| 包含内容 | JVM + 核心类库(如 java.lang, java.util 等) |
JRE + 开发工具(javac, java, javadoc, jdb, javap 等) |
| 是否包含编译器 | ❌ 不包含 javac |
✅ 包含 javac 编译器 |
| 体积大小 | 较小 | 较大(因为包含开发工具) |
| 适合场景 | 生产服务器部署(只运行程序) | 开发环境、测试环境、需要动态编译的场景 |
三、在服务器部署中的选择建议
✅ 推荐:生产服务器使用 JRE 或 JRE 等效的 JRE-only 运行时
- 大多数情况下,服务器上只需要运行 Java 应用(如 Spring Boot 打包成的 JAR),不需要编译源代码。
- 使用 JRE 可以:
- 减少磁盘占用
- 降低攻击面(减少不必要的工具)
- 更符合最小权限原则
⚠️ 注意:从 Java 11 开始,Oracle 不再提供独立的 JRE 下载包。你需要通过
jlink工具基于 JDK 自定义一个最小化运行时镜像,或直接使用 OpenJDK 提供的 JRE 版本(如 Adoptium/Eclipse Temurin 的 JRE 构建)。
🛠️ 需要 JDK 的情况(服务器上才装 JDK)
- 应用需要在运行时动态编译 Java 代码
- 比如使用
javax.tools.JavaCompiler(如某些脚本引擎、热更新框架)
- 比如使用
- 使用需要调试或诊断工具的场景
- 如使用
jstack,jmap,jstat分析 JVM 性能问题
- 如使用
- CI/CD 流水线中构建和部署一体化
- 在部署服务器上同时进行编译打包(不推荐,建议分离构建与部署环境)
四、总结:部署时怎么选?
| 场景 | 建议安装 |
|---|---|
| 纯粹运行已打包的 Java 应用(如 JAR/WAR) | ✅ JRE 或自定义运行时(推荐) |
| 需要调试、监控 JVM | ✅ JDK(方便使用诊断工具) |
| 动态编译 Java 代码 | ✅ 必须安装 JDK |
| 资源受限或安全要求高 | ✅ 使用最小化运行时(如 jlink 生成的镜像) |
五、现代实践建议(Java 11+)
-
使用 JDK 构建应用(开发/构建机器上)
-
使用 jlink 创建自定义运行时 部署到服务器:
jlink --add-modules java.base,java.sql,java.naming --output myapp-runtime这样可以生成一个比完整 JDK 小得多的运行环境。
-
或使用主流发行版提供的 JRE 构建版本,例如:
- Eclipse Temurin JRE
- Amazon Corretto JRE
- Microsoft Build of OpenJDK(提供 JRE 版本)
✅ 结论:
在服务器部署 Java 应用时,如果只是运行程序,优先选择 JRE 或最小化运行时;只有在需要编译或调试时才安装 JDK。这有助于提升安全性、节省资源。
云计算HECS