学 Java 时,我们经常会被两个概念绕晕:JDK 和 JRE 。
很多人背下来一句话:
"JDK = JRE + 开发工具"。
但当被问到------JRE 到底是什么?JDK 比 JRE 多了哪些东西?它们在运行程序时的角色有什么不同?
多数人还是一脸懵。
本文将带你从 结构组成 → 工作原理 → 实际场景 三个层面彻底搞清楚它们的本质区别。
1. JDK 与 JRE 的官方定义
- JRE(Java Runtime Environment) :Java 运行环境,包含运行 Java 程序所需的核心类库(Core Libraries)和 JVM。
- JDK(Java Development Kit) :Java 开发工具包,包含 JRE 以及 编译、调试、打包等开发工具。
一句话:
JRE 负责"运行",JDK 负责"开发 + 运行"。
2. 结构对比
用一个结构图来看更直观:
nginx
JDK
├── JRE
│ ├── JVM(Java Virtual Machine)
│ ├── 核心类库(rt.jar、charsets.jar 等)
│ └── 运行时支持文件
├── 开发工具(javac、javadoc、jar、jdb 等)
└── 其他辅助工具(jconsole、jvisualvm 等)
📌 关键点:
- JVM:负责将字节码解释/编译为机器码并执行。
- 核心类库 :包括
java.lang
、java.util
、java.io
等,Java 程序运行离不开它们。 - 开发工具 :
javac
(编译器)、jar
(打包)、javadoc
(文档生成)等只在开发阶段使用。
3. 工作原理上的区别
假设你有一个 Java 源文件:
java
public class Hello {
public static void main(String[] args) {
System.out.println("Hello Java");
}
}
用 JDK 完成的流程:
-
编译阶段
- 使用
javac Hello.java
→ 编译成Hello.class
(字节码文件)。 - 需要 javac(属于 JDK,JRE 没有)。
- 使用
-
运行阶段
- 使用
java Hello
→ JVM 加载并执行字节码。 - 需要 JVM + 核心类库(属于 JRE)。
- 使用
如果你只有 JRE:
- 你可以运行
java Hello
(前提是Hello.class
已存在)。 - 但你不能编译
Hello.java
(因为缺少javac
)。
换句话说:
JDK = 可以开发 + 运行
JRE = 只能运行
4. 类比理解
我们可以用一个生活类比来理解:
- JRE = 只有微波炉和食材的厨房 → 你可以加热和吃饭(运行程序)。
- JDK = 厨房 + 菜刀、锅铲、调料 → 你既能做饭(编译程序),也能吃饭(运行程序)。
5. 在不同场景下的选择
场景 | 推荐安装 |
---|---|
开发 Java 应用 | JDK(包含所有开发工具和运行环境) |
部署到服务器,只运行已编译程序 | JRE(体积小、运行环境足够) |
使用框架构建、调试、编译 | JDK |
纯运行环境(嵌入式、客户端运行) | JRE |
6. 自 JDK 11 之后的变化
Java 11 开始,Oracle 不再单独提供 JRE 下载包 ,只有 JDK 包。
如果你只需要运行 Java 程序,可以:
- 安装 JDK,但只用里面的
java
命令。 - 或者自己定制精简版运行时(用
jlink
生成)。
这意味着:
在新版本 Java 中,JDK 已经完全覆盖了 JRE 的功能,JRE 单独存在的意义在减少。
7. 总结记忆
对比点 | JDK | JRE |
---|---|---|
含 JVM | ✅ | ✅ |
核心类库 | ✅ | ✅ |
编译器(javac) | ✅ | ❌ |
开发工具 | ✅ | ❌ |
用途 | 开发 + 运行 | 运行 |
一句话记忆:
JRE 是运行时,JDK 是开发套件(包含 JRE)。
✅ 核心 takeaway
- 运行程序 → 需要 JRE
- 编写程序 → 需要 JDK(因为要编译)
- 新版 JDK 自带运行功能,不必额外装 JRE。