JRE 和 JDK 的区别是什么?
下面我从 JRE,JDK 的功能区别和安装说明两个方面说明两者的不同之处。
一句话概述:
JDK是 Java 的开发工具,它不仅提供了 Java 程序运行所需的 JRE,还提供了一系列的编译,运行等工具,如 javac,java,javaw 等。
JRE只是 Java 程序的运行环境,它最核心的内容就是 JVM(Java 虚拟机)及核心类库。一张总览图:
总览图说明
1.JVM–java virtual machine
JVM 就是我们常说的 java 虚拟机,它是整个 java 实现跨平台的最核心的部分,所有的 java 程序会首先被编译为.class 的类文件,这种类文件可以在虚拟机上执行,也就是说 class 并不直接与机器的操作系统相对应,而是经过虚拟机间接与操作系统交互,由虚拟机将程序解释给本地系统执行。
2.JRE – java runtime environment
JRE 是指 java 运行环境。光有 JVM 还不能成 class 的执行,因为在解释 class 的时候 JVM 需要调用解释所需要的类库 lib。在 JDK 的安装目录里你可以找到 jre 目录,里面有两个文件夹 bin 和 lib, 在这里可以认为 bin 里的就是 jvm,lib 中则是 jvm 工作所需要的类库,而 jvm 和 lib 和起来就称为 jre。所以,在你写完 java 程序编译成.class 之后,你可以把这个.class 文件和 jre 一起打包发给朋友,这样你的朋友就可以运行你写程序了。(jre 里有运行.class 的 java.exe)
3.JDK – java development kit
JDK 是 java 开发工具包,基本上每个学 java 的人都会先在机器上装一个 JDK,那他都包含哪几部分呢?让我们看一下 JDK 的安装目录。在目录下面有六个文件夹、一个 src 类库源码压缩包、和其他几个声明文件。其中,真正在运行 java 时起作用的是以下四个文件夹:bin、include、lib、 jre。现在我们可以看出这样一个关系,JDK 包含 JRE,而 JRE 包含 JVM。bin: 最主要的是编译器 (javac.exe)include:java 和 JVM 交互用的头文件 lib:类库 jre:java 运行环境(注意:这里的 bin、lib 文件夹和 jre 里的 bin、lib 是不同的)
JRE 和 JDK 的功能区别
JRE: Java Runtime Environment
JDK:Java Development Kit
JRE顾名思义是 java 运行时环境,包含了 java 虚拟机,java 基础类库。是使用 java 语言编写的程序运行所需要的软件环境,是提供给想运行 java 程序的用户使用的。
JDK顾名思义是 java 开发工具包。
JDK 主要包含三部分,
第一部分就是 Java 运行时环境,JVM。
第二部分就是 Java 的基础类库,这个类库的数量还是非常可观的。
第三部分就是 Java 的开发工具,它们都是辅助你更好的使用 Java 的利器。
JDK 是程序员使用 java 语言编写 java 程序所需的开发工具包,是提供给程序员使用的。JDK 包含了 JRE,同时还包含了编译 java 源码的编译器 javac,还包含了很多 java 程序调试和分析的工具:jconsole,jvisualvm 等工具软件,还包含了 java 程序编写所需的文档和 demo 例子程序。
** 小结:** 如果你需要运行 java 程序,只需安装 JRE 就可以了。如果你需要编写 java 程序,需要安装 JDK。
如下图,是JDK 和 JRE 功能一览图:
JRE 和 JDK 安装说明
1、如果安装了 JDK,会发同你的电脑有两套 JRE,一套位于 \Java\jdk1.7 \jre 另外一套位于 \Java\jre7 目录下。
JDK 中的 JRE
jdk 中包含的 jre,在 jre 的 bin 目录里有个 jvm.dll,既然 JRE 是运行时环境,那么运行在哪?肯定是 JVM 虚拟机上了。另,jre 的 lib 目录中放的是一些 JAVA 类库的 class 文件,已经打包成 jar 文件。第二个 JRE(独立出来的运行时环境)
不管是 JDK 中的 JRE 还是 JRE 既然是运行时环境必须有 JVM。所以 JVM 也是有两个的。
2、如果你只安装 JRE,而不是 JDK,那么只会在 C:\Program Files\Java 目录下安装唯一的一套 JRE。
为什么 Sun 要让 JDK 安装两套相同的 JRE?
这是因为 JDK 里面有很多用 Java 所编写的开发工具(如 javac.exe、jar.exe 等),而且都放置在 \lib\tools.jar 里。从下面例子可以看出,先将 tools.jar 改名为 tools1.jar,然后运行 javac.exe,显示如下结果: Exception in thread “main” java.lang.NoClassDefFoundError: com/sun/tools/javac /Main 这个意思是说,你输入 javac.exe 与输入 java -cp c:\jdk\lib\tools.jar com.sun.tools.javac.Main 是一样的,会得到相同的结果。从这里我们可以证明 javac.exe 只是一个包装器(Wrapper),而制作的目的是为了让开发者免于输入太长的指命。而且可以发现 \lib 目录下的程序都很小,不大于 2 9K,从这里我们可以得出一个结论。就是 JDK 里的工具几乎是用 Java 所编写,所以也是 Java 应用程序,因此要使用 JDK 所附的工具来开发 Java 程序,也必须要自行附一套 JRE 才行,所以位于 C:\Program Files\Java 目录下的那套 JRE 就是用来运行一般 Java 程序用的。
如果一台电脑安装两套以上的 JRE,谁来决定呢?
这个重大任务就落在 java.exe 身上。Java.exe 的工作就是找到合适的 JRE 来运行 Java 程序。 Java.exe 依照底下的顺序来查找 JRE:自己的目录下有没有 JRE;父目录有没有 JRE;查询注册表: [HKEY_LOCAL_MACHINE\SOFTWARE\JavaSoft\Java Runtime Environment] 所以 java.exe 的运行结果与你的电脑里面哪个 JRE 被执行有很大的关系。
补充:
eclipse、idea 等其他 IDE 有自己的编译器而不是用 JDK bin 目录中自带的,所以在安装时你会发现他们只要求你选中 jre 路径就 ok 了。