1. 程式人生 > >關於JDK,JRE,JVM寫的最好的文章。

關於JDK,JRE,JVM寫的最好的文章。

關於jdk和jre 

大家肯定在安裝JDK的時候會有選擇是否安裝單獨的jre,一般都會一起安裝,我也建議大家這樣做。因為這樣更能幫助大家弄清楚它們的區別: 

Jre 是java runtime environment, 是java程式的執行環境。既然是執行,當然要包含jvm,也就是大家熟悉的虛擬機器啦,還有所有java類庫的class檔案,都在lib目錄下打包成了jar。大家可以自己驗證。至於在windows上的虛擬機器是哪個檔案呢?學過MFC的都知道什麼是dll檔案吧,那麼大家看看jre/bin/client裡面是不是有一個jvm.dll呢?那就是虛擬機器。 

Jdk 是java development kit,是java的開發工具包,裡面包含了各種類庫和工具。當然也包括了另外一個Jre. 那麼為什麼要包括另外一個Jre呢?而且jdk/jre/bin同時有client和server兩個資料夾下都包含一個jvm.dll。說明是有兩個虛擬機器的。這一點不知道大家是否注意到了呢? 


相信大家都知道jdk的bin下有各種java程式需要用到的命令,與jre的bin目錄最明顯的區別就是jdk下才有javac,這一點很好理解,因為 jre只是一個執行環境而已。與開發無關,正因為如此,具備開發功能的jdk自己的jre下才會同時有client性質的jvm和server性質的 jvm, 而僅僅作為執行環境的jre下只需要client性質的jvm.dll就夠了。 

記得在環境變數path中設定jdk/bin路徑麼?這應該是大家學習Java的第一步吧,老師會告訴大家不設定的話javac和java是用不了的。確實jdk/bin目錄下包含了所有的命令。可是有沒有人想過我們用的java命令並不是 jdk/bin目錄下的而是jre/bin目錄下的呢?不信可以做一個實驗,大家可以把jdk/bin目錄下的java.exe剪下到別的地方再執行 java程式,發現了什麼?一切OK! 


那麼有人會問了?我明明沒有設定jre/bin目錄到環境變數中啊? 

試想一下如果java為了提供給大多數人使用,他們是不需要jdk做開發的,只需要jre能讓java程式跑起來就可以了,那麼每個客戶還需要手動去設定環境變數多麻煩啊?所以安裝jre的時候安裝程式自動幫你把jre的java.exe新增到了系統變數中,驗證的方法很簡單,大家看到了系統環境變數的 path最前面有“%SystemRoot%system32;%SystemRoot%;”這樣的配置,那麼再去Windows/system32下面去看看吧,發現了什麼?有一個java.exe。 

如果強行能夠把jdk/bin挪到system32變數前面,當然也可以迫使使用jdk/jre裡面的java,不過除非有必要,我不建議大家這麼做。使用單獨的jre跑java程式也算是客戶環境下的一種測試。 


——————————————————————————————————————————— 


通俗點來說: jdk是java的開發包,其中包括jre;jre僅僅是java的執行時環境;而JDK包括了同版本的JRE,此外還包括有編譯器和其它工具 

    JDK是java開發工具包(java Development Kit)的縮寫。它是一種構建在java平臺上釋出的應用程式、apple和元件的開發環境。JDK是一切java應用程式的基礎,所有的java應用程式是構建在這個之上的。它是一組API,也可以說是一些java Class。要成為一個Java程式設計師,JDK是必不可少的最基本的工具。 

    JRE是Java執行環境(Java Runtime Enviroment)的縮寫。它基本上就和Java虛擬機器是同一個概念。一般來說,在談論一個具體的產品的時候,可以說“JRE”,而說到理論中的一個模型的時候,我們常用的是“Java虛擬機器”。要使用Java程式,JRE是必不可少的環境。 

如果機子裡安裝了多個版本的jdk,如下: 

BEA Weblogic Server 7.0 自帶一套 JDK1.3.1_02 
下載了一套最新的JDK1.4.1_02 
JBuilder9自帶一套JKD1.4.1_02 
Oracle8.1.7自帶一套JRE1.1.7 
Ration Rose自帶一套JDK1.3 
DreamWeaver自帶一套JDK1.3 

      6套JRE,每套JRE都被各自安裝到不同的目錄,不會互相影響。當在控制檯執行java.exe,作業系統尋找JRE的方式如下: 

先找當前目錄下有沒有JRE 
再找父目錄下有沒有JRE 
接著在PATH路徑中找JRE(一般執行時從path中查詢,按照path設定前後順序,以前面為準) 
登錄檔HKEY_LOCAL_MACHINE\SOFTWARE\JavaSoft\Java Runtime Environment\ 檢視CurrentVersion的鍵值指向哪個JRE(一般XP下是這個:C:\Program Files\Java\jre6)


      最常用的是在PATH路徑中找JRE,一般情況下,自己的程式執行之前都會先在批處理檔案裡面臨時設定PATH,把自己用的JRE放到PATH路徑最前面,所以肯定會執行自己帶的JRE,不會造成版本混亂。 

—————————————————————————————————————————————— 
JDK就是Java Development Kit.簡單的說JDK是面向開發人員使用的SDK,它提供了Java的開發環境和執行環境。SDK是Software Development Kit 一般指軟體開發包,可以包括函式庫、編譯程式等。 
JRE是Java Runtime Enviroment是指Java的執行環境,是面向Java程式的使用者,而不是開發者。 
如果安裝了JDK,會發同你的電腦有兩套JRE,一套位於 \jre 另外一套位於 C:\Program Files\Java\jre1.5.0_15 目錄下,後面這套比前面那套少了Server端的Java虛擬機器,不過直接將前面那套的Server端Java虛擬機器複製過來就行了。而且在安裝JDK可以選擇是否安裝這個位於 C:\Program Files\Java 目錄下的JRE。如果你只安裝JRE,而不是JDK,那麼只會在 C:\Program Files\Java 目錄下安裝唯一的一套JRE。 
JRE的地位就象一臺PC機一樣,我們寫好的Win32應用程式需要作業系統幫我們執行,同樣的,我們編寫的Java程式也必須要JRE才能執行。所以當你裝完JDK後,如果分別在硬碟上的兩個不同地方安裝了兩套JRE,那麼你可以想象你的電腦有兩臺虛擬的Java PC機,都具有執行Java程式的功能。所以我們可以說,只要你的電腦安裝了JRE,就可以正確執行Java應用程式。 
1、為什麼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程式用的。 
2、如果一臺電腦安裝兩套以上的JRE,誰來決定呢? 
這個重大任務就落在java.exe身上。Java.exe的工作就是找到合適的JRE來執行Java程式。 Java.exe依照底下的順序來查詢JRE:自己的目錄下有沒有JRE;父目錄有沒有JRE;查詢登錄檔: [HKEY_LOCAL_MACHINE\SOFTWARE\JavaSoft\Java Runtime Environment] 所以java.exe的執行結果與你的電腦裡面哪個JRE被執行有很大的關係。 

ADD:(小小結) 

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而沒有編譯的功能。 

eclipse、idea等其他IDE有自己的編譯器而不是用JDK bin目錄中自帶的,所以在安裝時你會發現他們只要求你選中jre路徑就ok了。