JRE 和 JDK 的區別詳解

AlbenXie發表於2018-08-06

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 了。

相關文章