jdk與jre的區別

對於java初學者來說,往往不懂區分jdk和jre的區別,實際上這兩個東西差別很大的,有必要了解一下:
簡單的說JDK是面向開發人
使用的SDK,它提供了Java的開發環境和運行環境。SDK是Software Development Kit 一般指軟件開發包,可以包括函數庫、編譯程序等。JDK也就是Java Development Kit。
    JRE是Java Runtime Enviroment是指Java的運行環境,是面向Java程序的使用者,而不是開發者。如 果安裝了JDK,會發同你的電腦有兩套JRE,一套位於 C:\Program Files\Java\jdk1.5.0_04\jre 另外一套位於 C:\Program Files\Java\jre1.5.0_04 目錄下,後面這套比前面那套少了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被執行有很大的關係。

3、介紹JVM JRE目錄下的Bin目錄有兩個目錄:server與client。這就是真正的jvm.dll所在。 jvm.dll無法單獨工作,當jvm.dll啓動後,會使用explicit的方法(就是使用Win32 API之中的LoadLibrary()與GetProcAddress()來載入輔助用的動態鏈接庫),而這些輔助用的動態鏈接庫(.dll)都必須位 於jvm.dll所在目錄的父目錄之中。因此想使用哪個JVM,只需要設置PATH,指向JRE所在目錄底下的jvm.dll

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是不同的)總的來說JDK是用於java程序的開發,而jre則是隻能運行class而沒有編譯的功能。

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

-----------------------------------------------------------

關於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程序也算是客戶環境下的一種測試。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章