在学习和使用 Java 的过程中,几乎每个人都会遇到两个名词:JDKJRE

它们看起来很像,但作用完全不同。很多人一开始会混淆,甚至有些经验丰富的开发者也会模糊地说“反正装上 JDK 就能跑 Java 程序了”。

那么,它们到底是什么关系?今天我们就来彻底讲清楚。

先给一个直观的结论

JREJava 运行时环境,专门用来运行 Java 程序。

JDKJava 开发工具包,它不仅包含 JRE,还包含了编译、调试、打包等开发工具。

换句话说:

  • 如果你只想运行别人写好的 Java 程序,只需要装 JRE
  • 如果你想编写、编译、调试 Java 程序,就需要装 JDK

JDK 包含 JRE。这是最核心的关系。

拆开来看:JRE 里有什么?

JRE 的主要任务是让 Java 程序能跑起来。它包含:

  • Java 虚拟机(JVM):真正执行 Java 字节码的地方,负责内存管理、垃圾回收、线程调度等。
  • 核心类库:比如 java.langjava.utiljava.io 等,程序运行时必须依赖这些基础库。
  • 支持文件:比如配置文件、资源文件、类加载器所需的库等。

没有 JRE,你的计算机就无法运行任何 Java 程序。

再看 JDK:它多了什么?

JDK 除了包含一个完整的 JRE 之外,还额外提供了开发人员才需要的工具,例如:

  • javac:Java 编译器,把 .java 源文件编译成 .class 字节码。
  • jar:打包工具,把多个类文件打包成 JAR 包。
  • javadoc:从源代码中生成 API 文档。
  • jdb:Java 调试器,用于排查代码问题。
  • jconsolejvisualvm 等监控和调优工具。

如果你只装了 JRE,试图执行 javac 命令,系统会告诉你找不到这个命令。
而如果你装了 JDK,你会发现它的目录里有一个 jre 子文件夹,里面就是你用来运行程序的运行时环境。

一个类比帮你理解

可以把 Java 比作写文章:

  • JRE 相当于一个“阅读器”。它只能让你阅读已经写好的文章(运行程序)。
  • JDK 相当于“写作工具 + 阅读器”。它既包含文字编辑器、语法检查工具、格式转换工具(编译、打包、调试),也自带阅读器,方便你写完文章后立刻看效果。

所以,JDK 是给作者用的,JRE 是给读者用的。

常见误区与注意事项

  1. 误区一:装了 JDK 就不用单独装 JRE
    对,因为 JDK 里已经带了 JRE。不过有些软件安装时会建议再装一个独立 JRE,那通常是用来运行某个特定应用的,避免和开发环境冲突。
  2. 误区二:JRE 也能编译 Java 程序
    不能。JRE 没有编译器,只有 JDK 才有 javac
  3. 误区三: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。