深入java--JRE與JDK的區別

轉載:http://swiftlet.net/archives/639

http://java-mzd.iteye.com/blog/838514


1. 定義
JRE(Java Runtime Enviroment)是Java的運行環境。面向Java程序的使用者,而不是開發者。如果你僅下載並安裝了JRE,那麼你的系統只能運行Java程序。JRE是運行Java程序所必須環境的集合,包含JVM標準實現及 Java核心類庫。它包括Java虛擬機、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)。
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。
3. 難點
如果安裝了JDK,會發現你的電腦有兩套JRE,一套位於C:\Program Files\Java\jre6, 另外一套位於 C:\Program Files\Java\jdk1.6.0_41\jre目錄下。
JRE的地位就象一臺PC機一樣,我們寫好的Win32應用程序需要操作系統幫我們運行,同樣的,我們編寫的Java程序也必須要JRE才能運行。所以當你裝完JDK後,如果分別在硬盤上的兩個不同地方安裝了兩套JRE,那麼你可以想象你的電腦有兩臺虛擬的Java 
PC機,都具有運行Java程序的功能。所以我們可以說,只要你的電腦安裝了JRE,就可以正確運行Java應用程序。 
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被執行有很大的關係。

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


很多朋友可能跟我一樣,已經使用JAVA開發很久了,可是對JDK,JRE,JVM這三者的聯繫與區別,一直都是模模糊糊的。

    今天特寫此文,來整理下三者的關係。

 

    JDK : Java Development ToolKit(Java開發工具包)JDK是整個JAVA的核心,包括了Java運行環境(Java Runtime Envirnment),一堆Java工具(javac/java/jdb等)和Java基礎的類庫(即Java API 包括rt.jar)。

    最主流的JDKSun公司發佈的JDK,除了Sun之外,還有很多公司和組織都開發了屬於自己的JDK,例如國外IBM公司開發了屬於自己的JDK,國內淘寶也開發了屬於自己的JDK,各個組織開發自己的JDK都是爲了在某些方面得到一些提高,以適應自己的需求,比如IBM的JDK據說運行效率就比SUN的JDK高的多。但不管怎麼說,我們還是需要先把基礎的Sun JDK掌握好。

    JDK有以下三種版本:

J2SE,standard edition,標準版,是我們通常用的一個版本J2EE,enterpsise edtion,企業版,使用這種JDK開發J2EE應用程序J2ME,micro edtion,主要用於移動設備、嵌入式設備上的java應用程序

 

    我們常常用JDK來代指Java APIJava API是Java的應用程序接口,其實就是前輩們寫好的一些java Class,包括一些重要的語言結構以及基本圖形,網絡和文件I/O等等 ,我們在自己的程序中,調用前輩們寫好的這些Class,來作爲我們自己開發的一個基礎。當然,現在已經有越來越多的性能更好或者功能更強大的第三方類庫供我們使用。

 

    JRE:Java  Runtime  Enviromental(java運行時環境)。也就是我們說的JAVA平臺,所有的Java程序都要在JRE下才能運行。包括JVMJAVA核心類庫和支持文件。與JDK相比,它不包含開發工具——編譯器、調試器和其它工具。

 

    JVM:Java Virtual Mechinal(JAVA虛擬機)。JVM是JRE的一部分,它是一個虛構出來的計算機,是通過在實際的計算機上仿真模擬各種計算機功能來實現的。JVM有自己完善的硬件架構,如處理器、堆棧、寄存器等,還具有相應的指令系統。JVM 的主要工作是解釋自己的指令集(即字節碼)並映射到本地的 CPU 的指令集或 OS 的系統調用。Java語言是跨平臺運行的,其實就是不同的操作系統,使用不同的JVM映射規則,讓其與操作系統無關,完成了跨平臺性JVM 對上層的 Java 源文件是不關心的,它關注的只是由源文件生成的類文件( class file)。類文件的組成包括 JVM 指令集,符號表以及一些補助信息。

下圖很好的表面了JDK,JRE,JVM三者間的關係:



 

 

 

    我們開發的實際情況是:我們利用JDK(調用JAVA API)開發了屬於我們自己的JAVA程序後,通過JDK中的編譯程序(javac)將我們的文本java文件編譯成JAVA字節碼,在JRE上運行這些JAVA字節碼,JVM解析這些字節碼,映射到CPU指令集或OS的系統調用。


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