1. 程式人生 > >JDK與jre你知道多少?

JDK與jre你知道多少?

   最近在學習JVM的時候遇到了下面這張圖,引發了小編對JDK和JRE的思考,這兩個東西到底分別起到什麼作用?

  下面先來看一張圖:

 

 我們在上圖可以看到在整個java平臺邏輯結構中,JDK和jre明顯處在不同的位置,這就可以說明我們他們在正java

程式的生命週期中起著不同的作用,下面就簡單的來總結一下他們之間的不同:

   定義

 JDK(Java Development Kit)又稱J2SDK(Java2 Software Development Kit),是Java開發工具包,它提供了Java的

開發環境(提供了編譯器javac等工具,用於將java檔案編譯為class檔案)和執行環境(提 供了JVM和Runtime輔助包,

用於解析class檔案使其得到執行)。如果你下載並安裝了JDK,那麼你不僅可以開發Java程式,也同時擁有了執行

Java程式的平臺。JDK是整個Java的核心,包括了Java執行環境(JRE),一堆Java工具tools.jar和Java標準類庫 

(rt.jar)。

  JRE(Java Runtime Enviroment)是Java的執行環境。面向Java程式的使用者,而不是開發者。如果你僅下載並安

裝了JRE,那麼你的系統只能執行Java程式。JRE是執行Java程式所必須環境的集合,包含JVM標準實現及 Java核心類

庫。它包括Java虛擬機器、Java平臺核心類和支援檔案。它不包含開發工具(編譯器、偵錯程式等)。

  也就說:如果你安裝了JDK後,你會發現你的電腦有兩套JRE,一套位於C:\Program Files\Java\jre6另外一套位

於 C:\Program Files\Java\jdk1.6.0_41\jre(你的安裝路徑)目錄下。

  JRE的地位就象一臺PC機一樣,我們寫好的win64程式需要作業系統幫我們執行,同樣的,我們編寫的java程式也

必須要JRE才能執行。所以當你裝完JDK後,如果分別在硬碟上的兩個不同的地方安裝了兩套JRE,那麼你可以想象你

的電腦有兩臺虛擬的javaPC機,都具有執行java程式的功能。所以我們可以這樣說:只要我們的電腦安裝了JRE,我

們就以正確的執行java應用程式。

  2. 區別


   JRE主要包含:java類庫的class檔案(都在lib目錄下打包成了jar)和虛擬機器(jvm.dll);JDK主要包含:java類

庫的 class檔案(都在lib目錄下打包成了jar)並自帶一個JRE。那麼為什麼JDK要自帶一個JRE呢?而且jdk/jre/bin下

的client 和server兩個資料夾下都包含jvm.dll(說明JDK自帶的JRE有兩個虛擬機器)。

記得在環境變數path中設定jdk/bin路徑嗎?老師會告訴大家不設定的話javac和java是用不了的。確實jdk/bin目錄

下包含了所有的命令。可是有沒有人想過我們用的java命令並不是jdk/bin目錄下的而是jre/bin目錄下的呢?不信可

以做一個實驗,大家可以把jdk /bin目錄下的java.exe剪下到別的地方再執行java程式,發現了什麼?一切OK!(JRE

中沒有javac命令,原因很簡單,它不是開發環境)那麼有人會問了?我明明沒有設定jre/bin目錄到環境變數中啊?

試想一下如果java為了提供給大多數人使用,他們是不需要jdk做開發的,只需要jre能讓java程式跑起來就可以了,

那麼每個客戶還需要手動去設定環境變數多麻煩啊?所以安裝jre的時候安裝程式自動幫你把jre的java.exe新增到了

系統變數中,驗證的方法很簡單,去Windows/system32下面去看看吧,發現了什麼?有一個java.exe。

  1、為什麼Sun要讓JDK安裝兩套相同的JRE?


  這是因為JDK裡面有很多用Java所編寫的開發工具,如javac.exe、jar.exe等,這些命令放置在 C:\Program 

Files\Java\jdk1.6.0_41\bin目錄裡。因為他們是java編寫的命令,所以要依靠java的jar包,這些jar包存放在

C:\Program Files\Java\jdk1.6.0_41\lib目錄裡如果將C:\Program Files\Java\jdk1.6.0_41\lib\目錄裡面的

tools.jar改名為tools1.jar,然後執行javac.exe,顯示如下結果: 

  Exception in thread "main" java.lang.NoClassDefFoundError: com/sun/tools/javac /Main 

但是輸入 java -cp C:\Program Files\Java\jdk1.6.0_41\lib\tools1.jar com.sun.tools.javac.Main 

會得到與javac.exe相同的結果。從這裡我們可以證明javac.exe只是一個包裝器(Wrapper),而製作的目的是為了

讓開發者免於輸入太長的指命。而且我們可以發現C:\Program Files\Java\jdk1.6.0_41\bin目錄下的程式都很小,

不大於29K,從這裡我們可以得出一個結論。就是JDK裡的工具幾乎是用Java所編寫,所以也是Java應用程式,因此要

使用JDK所附的工具來開發Java程式,也必須要自行附一套JRE才行,所以位於

C:\Program Files\Java\jdk1.6.0_41\jre目錄下的那套JRE就是用來執行一般Java程式用的。 

  2、如果一臺電腦安裝兩套以上的JRE,誰來決定呢?


 這個重大任務就落在java.exe身上。java.exe的工作就是找到合適的JRE來執行Java程式。 java.exe依照底下的順

序來查詢JRE:自己的目錄下有沒有JRE;父目錄有沒有JRE;查詢登錄檔:


[HKEY_LOCAL_MACHINE\SOFTWARE\JavaSoft\Java Runtime Environment] 
所以java.exe的執行結果與你的電腦裡面

哪個JRE被執行有很大的關係。

   小結

          

  1.JVM -- java virtual machineJVM就是我們常說的java虛擬機器,它是整個java實現跨平臺的最核心的部分,所

有的java程式會首先被編譯為.class的類檔案,這種類檔案可以在虛擬機器上執行,也就是說class並不直接與機器的

作業系統相對應,而是經過虛擬機器間接與作業系統互動,由虛擬機器將程式解釋給本地系統執行。

  2.JRE -- java runtime environmentJRE是指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 kitJDK是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是不同的)總的來說JDK是用於java

程式的開發,而jre則是隻能執行class而沒有編譯的功能。

      歡迎拍磚。。。。。