JRE
JRE
JRE是Java Runtime Environment縮寫,指Java運行環境,是Sun的產品。運行JAVA程序所必須的環境的集合,包含JVM標準實現及Java核心類庫。
注意由於Microsoft對Java的支持不完全,請不要使用IE自帶的虛擬機來運行 Applet,務必安裝一個JRE或JDK。
JRE為Java Runtime Environment的簡稱,Java Runtime Environment(包括Java Plug-in)是Sun的產品,包括兩部分:Java Runtime Environment和Java Plug-in。JavaRuntimeEnvironment(JRE)是可以在其上運行、測試和傳輸應用程序的Java平台。它包括Java虛擬機(jvm)、Java核心類庫和支持文件。它不包含開發工具(JDK)--編譯器、調試器和其它工具。JRE需要輔助軟體--Java Plug-in--以便在瀏覽器中運行applet。
Java Plug-in軟體允許Java Applet和JavaBean組件在使用Sun的Java Runtime Environment(JRE)的瀏覽器中運行,而不是在使用預設的Java運行環境的瀏覽器中運行。Java Plug-in可用於Netscape Navigator和Microsoft Internet Explorer。
J2RE是Java2 Runtime Environment,即Java運行環境,只是強調其匹配Java2平台,有時簡稱JRE。如果你只需要運行Java程序或Applet,下載並安裝它即可。如果你要自行開發 Java軟體,請下載JDK(JRE和JDK的區別)。在JDK中附帶有JRE。
Java的解決辦法是每個程序自己攜帶一套JRE。
比如說某人的機器上已經被安裝了好多套JRE和JDK(JDK包括了同版本的JRE,此外還包括有編譯器和其它工具),它們分別是:
BEAWeblogic Server 7.0 自帶一套 JDK1.3.1_02,還下載了一套最新的JDK1.4.1_02
JBuilder9自帶一套JDK1.4.1_02
Oracle8.1.7自帶一套JRE1.1.7
RationRose自帶一套JDK1.3
DreamWeaver自帶一套JDK1.3
6套JRE,每套JRE都被各自安裝到不同的目錄,不會互相影響。當在控制台執行java.exe,操作系統尋找JRE的方式如下:
先找當前目錄下有沒有JRE
再找父目錄下有沒有JRE
接著在PATH路徑中找JRE
註冊表HKEY_LOCAL_MACHINE\SOFTWARE\JavaSoft\Java Runtime Environment\ 查看CurrentVersion的鍵值指向哪個JRE
最常用的是在PATH路徑中找JRE,一般情況下,自己的程序運行之前都會先在批處理文件裡面臨時設置PATH,把自己用的JRE放到PATH路徑最前面,所以肯定會運行自己帶的JRE,不會造成版本混亂。
JRE自帶的基礎類庫主要是JRE\lib\rt.jar這個文件,包括了Java2平台標準版的所有類庫。和JRE的版本一致。
Net Framekwork的核心類庫
Net Framekwork的核心類庫被放置在C:\Winnt\assembly\gac\目錄下,按照不同的名稱空間放在不同目錄中,不像JRE打成了一個包。並且可以同時存在不同的版本,例如:
某類庫1.0版本 C:\Winnt\assembly\gac\名稱\1.0\名稱.dll
某類庫1.1版本 C:\Winnt\assembly\gac\名稱\1.1\名稱.dll
這樣做,雖然很靈活,可以隨時把類庫更新到最新的狀態,但是很容易帶來版本管理的複雜度,造成版本不一致。
JRE中由ClassLoader負責查找和載入程序引用到的類庫,基礎類庫ClassLoader會到rt.jar中自動載入,其它的類庫,ClassLoader在環境變數CLASSPATH指定的路徑中搜索,按照先來先到的原則,放在CLASSPATH前面的類庫先被搜到,Java程序啟動之前建議先把PATH和CLASSPATH環境變數設好,OS通過PATH來找JRE,確定基礎類庫rt.jar的位置,JRE的ClassLoader通過CLASSPATH找其它類庫。但有時候會出現這樣的情況,希望替換基礎類庫中的類庫,那麼也可以簡單的通過-Djava.endrosed.path=...參數傳遞給java.exe,於是ClassLoader會先於基礎類庫使用java.endrosed.path參數指定路徑的類庫。因此Java的版本管理是非常簡單有效的,也許很原始,不過很好用,簡單就不容易出錯。(所以我很奇怪Eric Ramond為什麼批評Java的類庫管理機制,他還居然批評Java的介面,令人懷疑他對Java的了解程度)
Net Framework的類庫管理機制 .Net Framework的類庫管理機制相當強大和複雜,分為私有類庫和共享類庫。
私有類庫就放在exe程序當前路徑下,或其相對路徑中,只有當前程序可見。
1、共享類庫需要在GAC(Global Assembly Cache)中註冊,註冊過程比較複雜,首先要用工具生成公開/私有密鑰對,然後結合密鑰和類庫版本號連編,最後使用工具註冊到GAC中好以後,會被放在"C:\Winnt\assembly\gac\類庫的名稱空間\版本號\"目錄下,不同的類庫版本在註冊的時候會按照版本號分開放置:
·某類庫1.0版本 C:\Winnt\assembly\gac\名稱\1.0\名稱.dll
·某類庫1.1版本 C:\Winnt\assembly\gac\名稱\1.1\名稱.dll
2、可以同時存在一個類庫的n個版本,至於在程序中用哪個版本,在程序的配置文件中聲明,CLR會根據聲明來調用相應的版本的類庫。我覺得.Net實現方法未免太複雜了一些,將所有共享類庫都塞到一個系統目錄下,並且同一個類庫還有n個版本,將來.Net第三方開發的類庫逐漸豐富起來以後,.Net類庫的GAC也會越來越龐大,會不會也搞得和Windows註冊表一樣難以維護?軟體發布到伺服器上的時候,類庫要再註冊一次,伺服器會逐漸形成一個龐大的樹狀的GAC,GAC裡面存放著組件的n個版本。
全局程序集緩存不會是無限大的,所以“將來.Net第三方開發的類庫逐漸豐富起來以後,.Net類庫的GAC也會越來越龐大,會不會也搞得和Windows註冊表一樣難以維護?”這是杞人憂天。原因如下:第一是操作系統的生命周期一般不會是無限長的,而且越來越短,Windows為證,同時.Net Framework也在不斷更迭,在十年左右的時間裡,全球的程序產量是有限的,高質量的第三方開發的類庫更是有限,需要註冊到GAC的就更少了。
Java運行時環境與Java平台
儘管Java Runtime Environment是Java平台的一部分,但Java Runtime Environment不應與Java平台合併。原因是,Java平台是一般的東西,但Java Runtime Environment是一個SPECIFIC組件,就像Java Development Kit一樣。
Java Runtime Environment不是“來自Sun”
遺憾的是,這篇文章不僅是錯誤的,而且傳播了錯誤觀念,即運行Java需要Sun Microsystems:<<“Java Runtime Environment,或JRE,是Sun Microsystems的軟體包,它允許計算機系統運行Java應用程序。”>>Sun實際上擁有(* note1)Java規範,但任何人(* note2)都可以編寫Java Runtime實現。(注意1:好的,確定,有JCP,但實際上Sun擁有該語言。)(注2:好的,不是任何人;編寫實現的人必須承諾不破壞規範(例如,像微軟試圖做的那樣)通過許可Sun的規範 - 但這只是實現虛擬機的權利。)。
● 當然,sun的方式限制了規範,只有基於Sun實現的運行時才能訪問測試工具包,這是他們遵守Java許可要求的證明。沒有測試,您不能稱自己為Java或避免侵犯各種軟體專利。SteveLoughran2007年10月10日20:00(UTC)
在sun.com下載頁面上,當前版本是“Java(TM)SE Runtime Environment 6”。java.com測試頁要我更新到“版本6更新2”。我安裝的版本是最近的(幾周),但版本號為1.5.0_11。
-87.162.24.12610:46,2007年7月24日(UTC)
● 這也是我的猜測,但是Sun似乎並沒有直截了當地承認1.6可能和6相同,而且顛覆了6. FWIW我剛剛下載了Sun在Vista Home Premium和Java Control上調用的最新版本Panel報告版本標準版6,版本1.6.0(版本1.6.0_02-b06)。當我使用Netscape Navigator(版本9.0b3)訪問Sun的測試頁時,測試頁報告版本:6更新2.但是,使用Firefox 2.0.0.6,Sun的測試頁報告java.lang.NullPointerException,正如其他人所發現的那樣。
通過閱讀長期存在的bugzilla 83376(自2001年以來)追蹤了Java引發FF2異常的可能原因看起來Sun的Java插件(甚至是最新版本)在FF2下使用了useragent(UA)欺騙(仍然一些網站所需要的,因為,用Sun自己2001年的話來說:“Java插件依賴於用戶代理字元串來獲取版本信息,不會做出修復。”很好,最後。這意味著FF的UA必須在啟動時默認(不是欺騙)。如果FF的UA被欺騙,那麼下次FF啟動時Java會引發異常。尷尬,但至少我現在有一個解決方法修復。
奇怪的是,JRE術語(這個術語很常見)會重定向到Java虛擬機,而Java虛擬機主要由已經知道Java是什麼的人使用。似乎更好地解釋什麼是JRE,並在那裡提供wiki鏈接。