在服务器部署 Java 应用时,JRE(Java Runtime Environment)和 JDK(Java Development Kit)的核心区别在于:你只需要 JRE 就能运行程序,而 JDK 包含了 JRE 并额外提供了开发工具。
简单来说:
- JRE = 运行时环境(只负责“跑”程序)
- JDK = 开发工具包(包含 JRE + 编译、调试等工具)
一、核心区别对比表
| 特性 | JRE (Java Runtime Environment) | JDK (Java Development Kit) |
|---|---|---|
| 全称 | Java 运行时环境 | Java 开发工具包 |
| 用途 | 运行已编译的 Java 程序(.class/.jar) | 开发、编译、测试、运行 Java 程序 |
| 是否包含 JRE | ❌ 就是 JRE 本身 | ✅ 包含完整的 JRE |
| 主要组件 | JVM + 核心类库 + 启动脚本 | JRE + javac(编译器)+ jar(打包工具)+ jdb(调试器)+ javadoc(文档生成)等 |
| 体积大小 | 较小(通常几百 MB) | 较大(通常 200MB~500MB+) |
| 适用场景 | 生产环境部署、仅运行应用 | 本地开发、CI/CD 构建、需要动态编译代码的场景 |
| 权限要求 | 较低(只需执行权限) | 较高(需写入编译产物、日志等) |
二、详细解释
1. JRE(Java Runtime Environment)
- 作用:提供 Java 程序运行所需的最小环境。
- 包含内容:
- JVM(Java Virtual Machine):真正执行字节码的虚拟机。
- 核心类库(rt.jar 等):如
java.lang,java.util,java.io等基础 API。 - 启动脚本:如
java.exe/java命令。
- 优点:
- 体积小,节省磁盘空间和内存。
- 安全性更高(没有编译工具,无法轻易修改或重新编译代码)。
- 适合纯生产环境,降低攻击面。
- 缺点:
- 不能用于编译新代码。
- 如果应用依赖某些动态加载类的功能,可能缺少部分工具支持。
2. JDK(Java Development Kit)
- 作用:为开发者提供完整的 Java 开发工具链。
- 包含内容:
- 完整 JRE(如上所述)。
- javac:Java 编译器,将
.java源文件编译成.class字节码。 - jar/jarfile:打包和解压工具。
- javadoc:从源码注释生成 HTML 文档。
- jdb:命令行调试器。
- 其他工具:如
javap(反汇编)、jstat(性能监控)、jmap(内存分析)等。
- 优点:
- 功能完整,可用于开发、测试、构建、运行全流程。
- CI/CD 流水线中常使用 JDK 进行自动化编译和打包。
- 缺点:
- 体积大,占用更多资源。
- 在生产服务器上安装 JDK 可能带来额外的安全风险(黑客可利用编译工具注入恶意代码)。
三、服务器部署建议
✅ 推荐做法:生产环境只装 JRE(或更现代的 JRE/JRE-like 运行时)
- 如果你的应用是预编译好的(如
.jar,.war,.exe),只需 JRE。 - 现代最佳实践是使用 OpenJDK Runtime Image (JRI) 或 Docker 镜像中的精简版 JRE,进一步缩小体积。
- 例如:使用
eclipse-temurin:17-jre-alpine而不是eclipse-temurin:17。
⚠️ 何时需要 JDK?
- CI/CD 构建阶段:在持续集成服务器(如 Jenkins、GitLab CI)上编译代码。
- 热更新/动态编译:某些框架(如 Groovy、Scripting 引擎)需要在运行时动态编译 Java 代码。
- 故障排查:运维人员需要现场调试、dump 堆内存、分析线程状态等高级诊断操作(但也可通过远程连接开发机或使用轻量级工具实现)。
- 容器化构建:在多阶段 Docker 构建中,第一阶段用 JDK 编译,第二阶段用 JRE 运行,最终镜像只包含 JRE。
四、现代替代方案:GraalVM Native Image 或 精简运行时
随着技术发展,还有更优的选择:
| 方案 | 说明 |
|---|---|
| Spring Boot Executable Jar + JRE | 最主流方式,JAR 内嵌 Tomcat,只需 JRE 运行。 |
| Docker + JRE 镜像 | 使用 openjdk:17-jre-slim 等轻量镜像,减少攻击面。 |
| GraalVM Native Image | 将 Java 应用提前编译成原生二进制文件,无需 JVM,极致性能和小体积。 |
| jlink(模块化定制 JRE) | Java 9+ 支持,可只打包应用所需的模块,生成最小化 JRE,比标准 JRE 更小。 |
💡 示例:使用 jlink 创建最小 JRE
jlink --module-path $JAVA_HOME/jmods --add-modules java.base,java.logging,java.sql --output my-app-runtime这样生成的
my-app-runtime只包含你的应用需要的模块,体积远小于完整 JRE。
总结
| 场景 | 推荐选择 |
|---|---|
| 本地开发 | JDK |
| CI/CD 构建 | JDK |
| 生产服务器部署(常规) | JRE(或精简 JRE) |
| 生产服务器部署(高性能/小体积) | GraalVM Native Image 或 jlink 定制 JRE |
结论:对于大多数服务器部署场景,只需安装 JRE 即可。除非你有动态编译或高级调试需求,否则不要在生产服务器上安装完整的 JDK。
云知识CLOUD