JDK 与 JRE 的关系:你真的分清了吗?
在学习和使用 Java 的过程中,几乎每个人都会遇到两个名词:JDK 和 JRE。
它们看起来很像,但作用完全不同。很多人一开始会混淆,甚至有些经验丰富的开发者也会模糊地说“反正装上 JDK 就能跑 Java 程序了”。
那么,它们到底是什么关系?今天我们就来彻底讲清楚。
先给一个直观的结论
JRE 是 Java 运行时环境,专门用来运行 Java 程序。
JDK 是 Java 开发工具包,它不仅包含 JRE,还包含了编译、调试、打包等开发工具。
换句话说:
- 如果你只想运行别人写好的 Java 程序,只需要装 JRE。
- 如果你想编写、编译、调试 Java 程序,就需要装 JDK。
JDK 包含 JRE。这是最核心的关系。
拆开来看:JRE 里有什么?
JRE 的主要任务是让 Java 程序能跑起来。它包含:
- Java 虚拟机(JVM):真正执行 Java 字节码的地方,负责内存管理、垃圾回收、线程调度等。
- 核心类库:比如
java.lang、java.util、java.io等,程序运行时必须依赖这些基础库。 - 支持文件:比如配置文件、资源文件、类加载器所需的库等。
没有 JRE,你的计算机就无法运行任何 Java 程序。
再看 JDK:它多了什么?
JDK 除了包含一个完整的 JRE 之外,还额外提供了开发人员才需要的工具,例如:
javac:Java 编译器,把.java源文件编译成.class字节码。jar:打包工具,把多个类文件打包成 JAR 包。javadoc:从源代码中生成 API 文档。jdb:Java 调试器,用于排查代码问题。jconsole、jvisualvm等监控和调优工具。
如果你只装了 JRE,试图执行 javac 命令,系统会告诉你找不到这个命令。
而如果你装了 JDK,你会发现它的目录里有一个 jre 子文件夹,里面就是你用来运行程序的运行时环境。
一个类比帮你理解
可以把 Java 比作写文章:
- JRE 相当于一个“阅读器”。它只能让你阅读已经写好的文章(运行程序)。
- JDK 相当于“写作工具 + 阅读器”。它既包含文字编辑器、语法检查工具、格式转换工具(编译、打包、调试),也自带阅读器,方便你写完文章后立刻看效果。
所以,JDK 是给作者用的,JRE 是给读者用的。
常见误区与注意事项
- 误区一:装了 JDK 就不用单独装 JRE
对,因为 JDK 里已经带了 JRE。不过有些软件安装时会建议再装一个独立 JRE,那通常是用来运行某个特定应用的,避免和开发环境冲突。 - 误区二:JRE 也能编译 Java 程序
不能。JRE 没有编译器,只有 JDK 才有javac。 - 误区三:JRE 和 JDK 版本必须完全一致
通常建议保持一致,高版本 JVM 通常可以运行低版本 javac 编译出的类文件,但高版本编译的类无法在低版本 JVM 上运行;同时 Java 大版本间可能存在不兼容变更,并非绝对兼容。
版本演进中的变化(Java 9 以后)
在 Java 8 及以前,JDK 目录下确实有一个独立的 jre 子目录。
从 Java 9 开始引入了模块化系统(Project Jigsaw),JDK 不再默认生成一个独立的 JRE 文件夹。但逻辑上,JDK 依然包含运行程序所需的所有运行时组件。如果你需要一个单独用于运行的 JRE,可以用 jlink 工具按需裁剪生成一个轻量级运行时镜像。
这一点对普通开发者影响不大,但有助于理解:两者依然是“包含”关系,只是物理组织形式发生了变化。
总结:一张表
| 特性 | JRE | JDK |
|---|---|---|
| 全称 | Java Runtime Environment | Java Development Kit |
| 用途 | 运行 Java 程序 | 开发 + 运行 Java 程序 |
| 面向人群 | 普通用户、服务器部署 | 开发者、学习者 |
| 包含 JVM | ✅ | ✅ |
| 包含核心类库 | ✅ | ✅ |
包含编译器 javac |
❌ | ✅ |
| 包含调试、打包等工具 | ❌ | ✅ |
| 是否包含对方 | ❌ | ✅(包含 JRE) |
最后一句实用建议
- 普通用户(比如只玩 Minecraft Java 版):安装 JRE 就够了,不过现在很多 Java 版游戏已自带运行时,不再强制用户手动装 JRE。
- 学生、程序员、想写 Java 代码的人:直接装 JDK,一步到位。
理解了 JDK 和 JRE 的关系,你也就理解了 Java 程序“一次编写,到处运行”的基础设施是如何组织的。
下次别人再问你,你可以自信地说:JDK 是 JRE 的超集,开发用 JDK,运行可只用 JRE。




