JDK用于开发Java程序,含javac等工具;JRE仅用于运行,含java.exe和核心类库。装JDK自带JRE,但单独装JRE无法编译代码。

JDK 是用来写 Java 程序的,JRE 是用来跑 Java 程序的——这是最直白、最不会出错的判断标准。
装 JDK 就自动有了 JRE,但装 JRE 不能编译代码
如果你在官网下载安装了 JDK(比如 jdk-21.0.2),安装目录下会自带一个 jre 文件夹:
C:\Program Files\Java\jdk-21.0.2\jre。这个内嵌的
JRE 就是 JDK 能运行自己编译出的 .class 文件的基础。而单独安装的 JRE(如 jre-8u391)只含 java.exe 和运行必需的类库,没有 javac.exe,你双击运行 MyApp.class 没问题,但敲 javac MyApp.java 会直接报错:'javac' is not recognized as an internal or external command。
- 开发场景必须装
JDK:写代码 →javac编译 →java运行 → 调试 → 打包 - 纯用户场景可只装
JRE:比如运行某个 Java 写的 PDF 工具、老版 Minecraft 启动器,或企业内部的 Java 报表客户端 - Windows 上可能看到两套
JRE:一套在C:\Program Files\Java\jre1.8.0_XXX,另一套在JDK目录下的\jre;它们彼此独立,PATH指向哪套,java -version就显示哪套
bin 目录里藏着关键区别:javac vs java
JDK 的 bin 目录下有这些核心工具:javac.exe(编译器)、java.exe(启动器)、jdb.exe(调试器)、javadoc.exe(文档生成);而 JRE 的 bin 目录只有 java.exe、javaw.exe(无控制台窗口版)、keytool.exe(密钥管理)等运行时相关命令。
-
javac只存在于JDK,它把.java源文件翻译成 JVM 能读的.class字节码 -
java在JDK和JRE中都有,但行为一致:加载.class,调用 JVM 执行 - 别被路径迷惑:即使你把
JDK的bin加进PATH,实际执行java命令时,它默认会去同级的jre\bin下找jvm.dll—— 不是你以为的“JDK/bin/java.exe自己干活”
类库和 JVM 的归属关系:rt.jar、jvm.dll、lib/ext 都在哪
JRE 的核心是两样东西:jvm.dll(Windows)或 libjvm.so(Linux) + rt.jar(Java 核心类库,如 java.lang.*、java.util.*)。这些都在 JRE 的 lib 和 bin 下。而 JDK 的 lib 目录还多出 tools.jar(含 javac 的实现类)、dt.jar(设计时支持),这些不参与运行,只服务开发过程。
立即学习“Java免费学习笔记(深入)”;
-
JRE/lib/rt.jar是所有 Java 程序运行时都依赖的“基础 API”,没它new ArrayList()都会NoClassDefFoundError -
JDK/lib/tools.jar是javac自己的“身体”,但它不在运行时 classpath 里;IDE(如 IntelliJ)会显式引用它来实现语法检查和编译 - 不要手动替换
JRE下的rt.jar或jvm.dll:版本错配会导致UnsupportedClassVersionError或 JVM 直接崩溃
JVM 本身不是独立安装项,它永远依附于某套 JRE 或 JDK 存在;真正容易被忽略的是:同一台机器上多个 JDK/JRE 共存时,java -version 显示的版本,取决于 PATH 中最先匹配到的 java.exe,而不是你“以为正在用”的那个 JDK。










