中科永聯(lián)高級技術(shù)培訓中心(www.itisedu.com)
JRE(Java Runtime Environment,Java運行環(huán)境),運行JAVA程序所必須的環(huán)境的集合,包含JVM標準實(shí)現及Java核心類(lèi)庫。
jre為JavaRunTimeEnvirment的簡(jiǎn)稱(chēng),JavaRuntimeEnvironment(包括JavaPlug-in)是Sun的產(chǎn)品,包括兩部分:JavaRuntimeEnvironment和JavaPlug-inJavaRuntimeEnvironment(JRE)是可以在其上運行、測試和傳輸應用程序的Java平臺。它包括Java虛擬機、Java平臺核心類(lèi)和支持文件。它不包含開(kāi)發(fā)工具--編譯器、調試器和其它工具。JRE需要輔助軟件--JavaPlug-in--以便在瀏覽器中運行applet。
JavaPlug-in軟件允許Javaapplet和JavaBeans組件在使用Sun的JavaRuntimeEnvironment(JRE)的瀏覽器中運行,而不是在使用缺省的Java運行環(huán)境的瀏覽器中運行。JavaPlug-in可用于NetscapeNavigator和MicrosoftInternetExplorer。
J2RE是Java2 Runtime Environment,即Java運行環(huán)境,有時(shí)簡(jiǎn)稱(chēng)JRE。如果你只需要運行Java程序或Applet,下載并安裝它即可。如果你要自行開(kāi)發(fā) Java軟件,請下載JDK。在JDK中附帶有JRE。注意由于Microsoft對Java的支持不完全,請不要使用IE自帶的虛擬機來(lái)運行 Applet,務(wù)必安裝一個(gè)JRE或JDK。
一、JRE的版本管理
Java的解決辦法是每個(gè)程序自己攜帶一套JRE。
我的機器上已經(jīng)被安裝了好多套JRE和JDK了(JDK包括了同版本的JRE,此外還包括有編譯器和其它工具),它們分別是:
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都被各自安裝到不同的目錄,不會(huì )互相影響。當在控制臺執行java.exe,操作系統尋找JRE的方式如下:
先找當前目錄下有沒(méi)有JRE
再找父目錄下有沒(méi)有JRE
接著(zhù)在PATH路徑中找JRE
注冊表HKEY_LOCAL_MACHINE\SOFTWARE\JavaSoft\Java Runtime Environment\ 查看CurrentVersion的鍵值指向哪個(gè)JRE
最常用的是在PATH路徑中找JRE,一般情況下,自己的程序運行之前都會(huì )先在批處理文件里面臨時(shí)設置PATH,把自己用的JRE放到PATH路徑最前面,所以肯定會(huì )運行自己帶的JRE,不會(huì )造成版本混亂。
.Net Framework的版本管理
.NetFramework被固定安裝在C:\Winnt\Microsoft.NET\Framework\v版本號\目錄下,并且在同一臺機器只能安裝一套,要安裝1.1版本的.Net Framework,就必須先刪除1.0的。聽(tīng)說(shuō)剛發(fā)行的.NetFramework1.1已經(jīng)對1.0做了很多改進(jìn),甚至基礎類(lèi)庫的層次也有所變動(dòng)??磥?lái)在舊版本的.NetFramework開(kāi)發(fā)的程序將來(lái)往新版本上面遷移的時(shí)候少不了修改程序代碼。
二、JRE的基礎類(lèi)庫
JRE自帶的基礎類(lèi)庫主要是JRE\lib\rt.jar這個(gè)文件,包括了Java2平臺標準版的所有類(lèi)庫。和JRE的版本一致。
.Net Framekwork的核心類(lèi)庫
.Net Framekwork的核心類(lèi)庫被放置在C:\Winnt\assembly\gac\目錄下,按照不同的名稱(chēng)空間放在不同目錄中,不像JRE打成了一個(gè)包。并且可以同時(shí)存在不同的版本,例如:
某類(lèi)庫1.0版本 C:\Winnt\assembly\gac\名稱(chēng)\1.0\名稱(chēng).dll
某類(lèi)庫1.1版本 C:\Winnt\assembly\gac\名稱(chēng)\1.1\名稱(chēng).dll
這樣做,雖然很靈活,可以隨時(shí)把類(lèi)庫更新到最新的狀態(tài),但是很容易帶來(lái)版本管理的復雜度,造成版本不一致。
三、JRE類(lèi)庫的查找方法和版本管理
JRE中由ClassLoader負責查找和加載程序引用到的類(lèi)庫,基礎類(lèi)庫ClassLoader會(huì )到rt.jar中自動(dòng)加載,其它的類(lèi)庫,ClassLoader在環(huán)境變量CLASSPATH指定的路徑中搜索,按照先來(lái)先到的原則,放在CLASSPATH前面的類(lèi)庫先被搜到,Java程序啟動(dòng)之前建議先把PATH和CLASSPATH環(huán)境變量設好,OS通過(guò)PATH來(lái)找JRE,確定基礎類(lèi)庫rt.jar的位置,JRE的ClassLoader通過(guò)CLASSPATH找其它類(lèi)庫。但有時(shí)候會(huì )出現這樣的情況,希望替換基礎類(lèi)庫中的類(lèi)庫,那么也可以簡(jiǎn)單的通過(guò)-Djava.endrosed.path=...參數傳遞給java.exe,于是ClassLoader會(huì )先于基礎類(lèi)庫使用java.endrosed.path參數指定路徑的類(lèi)庫。因此Java的版本管理是非常簡(jiǎn)單有效的,也許很原始,不過(guò)很好用,簡(jiǎn)單就不容易出錯。(所以我很奇怪EricRamond為什么批評Java的類(lèi)庫管理機制,他還居然批評Java的接口,令人懷疑他對Java的了解程度)
.Net Framework的類(lèi)庫管理機制
.Net Framework的類(lèi)庫管理機制相當強大和復雜,分為私有類(lèi)庫和共享類(lèi)庫。
私有類(lèi)庫就放在exe程序當前路徑下,或其相對路徑中,只有當前程序可見(jiàn)。
共享類(lèi)庫需要在GAC(Global AssemblyCache)中注冊,注冊過(guò)程比較復雜,首先要用工具生成公開(kāi)/私有密鑰對,然后結合密鑰和類(lèi)庫版本號連編,最后使用工具注冊到GAC中好以后,會(huì )被放在"C:\Winnt\assembly\gac\類(lèi)庫的名稱(chēng)空間\版本號\"目錄下,不同的類(lèi)庫版本在注冊的時(shí)候會(huì )按照版本號分開(kāi)放置:
·某類(lèi)庫1.0版本 C:\Winnt\assembly\gac\名稱(chēng)\1.0\名稱(chēng).dll
·某類(lèi)庫1.1版本 C:\Winnt\assembly\gac\名稱(chēng)\1.1\名稱(chēng).dll
也就是可以同時(shí)存在一個(gè)類(lèi)庫的n個(gè)版本,至于在程序中用哪個(gè)版本,在程序的配置文件中聲明,CLR會(huì )根據聲明來(lái)調用相應的版本的類(lèi)庫。我覺(jué)得.Net實(shí)現方法未免太復雜了一些,將所有共享類(lèi)庫都塞到一個(gè)系統目錄下,并且同一個(gè)類(lèi)庫還有n個(gè)版本,將來(lái).Net第三方開(kāi)發(fā)的類(lèi)庫逐漸豐富起來(lái)以后,.Net類(lèi)庫的GAC也會(huì )越來(lái)越龐大,會(huì )不會(huì )也搞得和Windows注冊表一樣難以維護?軟件發(fā)布到服務(wù)器上的時(shí)候,類(lèi)庫要再注冊一次,服務(wù)器會(huì )逐漸形成一個(gè)龐大的樹(shù)狀的GAC,GAC里面存放著(zhù)組件的n個(gè)版本。試想經(jīng)過(guò)一段時(shí)間之后,C:\Winnt\assembly\gac\目錄會(huì )越來(lái)越龐大,有的組件甚至有n個(gè)版本都放在那里,你又不敢隨便刪除,不知道是不是有程序需要使用,我不明白MS為什么要把這么簡(jiǎn)單的事情搞到這么復雜?
聯(lián)系客服