在将 Java 项目部署到生产服务器时,理解 JDK(Java Development Kit)和 JRE(Java Runtime Environment)的区别至关重要。简单来说:
JRE 是运行 Java 程序所必需的最低环境;JDK 包含了 JRE,并额外提供了开发工具。
一、核心区别对比
| 特性 | JRE(Java Runtime Environment) | JDK(Java Development Kit) |
|---|---|---|
| 用途 | 仅用于运行已编译的 Java 程序(.class/.jar) |
用于开发、编译、调试 Java 程序 |
| 包含内容 | JVM + 核心类库(rt.jar 等) + 基础工具(如 java, javaw) |
JRE + 编译器(javac)、调试器(jdb)、文档生成器(javadoc)等开发工具 |
| 体积 | 较小(通常几百 MB) | 较大(通常 100–200+ MB,取决于版本) |
| 是否必需 | ✅ 生产服务器运行 Java 应用必须安装 | ❌ 生产服务器不需要安装(除非你在服务器上直接编译代码) |
| 典型组件 | bin/java, lib/rt.jar, lib/jce.jar 等 |
所有 JRE 内容 + bin/javac, bin/jar, bin/javadoc 等 |
二、生产服务器部署建议
✅ 推荐做法:只安装 JRE(或更现代的 JRE-like 运行时)
- 如果你的项目已经打包成
.jar、.war(放入 Tomcat/Jetty 等容器)或其他可执行格式,生产服务器只需 JRE。 - 使用轻量级的 JRE 或 OpenJDK Runtime Only 可以节省磁盘空间、减少攻击面、提升安全性。
- 现代发行版(如 Ubuntu、CentOS)通常提供
openjdk-<version>-jre包,而非完整的jdk包。
# Ubuntu/Debian 示例
sudo apt install openjdk-17-jre-headless # 无 GUI 依赖,适合服务器
# CentOS/RHEL 示例
sudo yum install java-17-openjdk-headless
⚠️ 何时需要 JDK?
- 你在生产服务器上动态编译 Java 代码(极少见,不推荐)。
- 你需要使用
javac、javadoc、jcmd等开发/诊断工具进行故障排查(但多数诊断工具在 JRE 中也可用,如jps、jstat、jmap等在较新 JRE 中已集成)。 - 某些监控或 APM 工具可能需要 JDK 中的完整类路径(但大多数现代工具兼容纯 JRE)。
📌 注意:从 Java 9+ 开始,模块化系统引入后,JRE 和 JDK 的界限更加清晰,且许多原本在 JDK 中的工具(如
jcmd、jstack)被移入 JRE 的bin目录,因此生产环境即使使用 JRE,也能获得大部分诊断能力。
三、常见误区澄清
| 误区 | 正确理解 |
|---|---|
| “生产服务器必须装 JDK” | 错误。只要应用能运行,JRE 就足够。 |
| “JDK 比 JRE 更安全” | 不一定。JDK 包含更多工具,潜在攻击面更大,生产环境应最小化安装。 |
| “用 JDK 代替 JRE 没问题” | 功能上可行,但不符合最小权限原则,浪费资源,增加维护成本。 |
四、最佳实践总结
- 构建阶段:使用 JDK 编译项目,打包为可执行文件(如 Spring Boot fat jar、WAR 等)。
- 部署阶段:在生产服务器上仅安装 JRE(推荐
headless版本,无图形依赖)。 - 验证方式:确保
java -version命令可用即可,无需javac。 - 容器化场景:在 Docker 镜像中,使用基于
jre或alpine+jre的基础镜像,避免嵌入 JDK。
# 推荐的生产级 Dockerfile 片段
FROM eclipse-temurin:17-jre-alpine
COPY app.jar /app.jar
ENTRYPOINT ["java", "-jar", "/app.jar"]
五、补充:现代替代方案
- GraalVM Native Image:将 Java 应用编译为原生二进制文件,完全脱离 JVM,既不需要 JDK 也不需要 JRE。
- Shaded JAR / Fat JAR:Spring Boot 等项目可将依赖打包进一个 JAR,配合 JRE 即可运行。
✅ 结论:
在生产服务器上,优先选择 JRE(尤其是 headless 版本),除非你有明确的开发或特殊诊断需求才考虑 JDK。这符合“最小化部署”、“安全加固”和“资源优化”的工程原则。
轻量云Cloud