JRE

出自 华夏文化百科
前往: 導覽搜尋


JRE為Java Runtime Envirment的簡稱,Java Runtime Environment(包括JavaPlug-in)是Sun的產品,包括兩部分:Java Runtime Environment和JavaPlug-in Java Runtime Environment(JRE)是可以在其上運行、測試和傳輸應用程序的Java平台。它包括Java虛擬機、Java平台核心類和支持文件。它不包含開發工具--編譯器、調試器和其它工具。JRE需要輔助軟件--JavaPlug-in--以便在瀏覽器中運行applet


JavaPlug-in软件允许Java applet和JavaBeans组件在使用Sun的Java Runtime Environment(JRE)的浏览器中运行,而不是在使用缺省的Java运行环境的浏览器中运行。Java Plug-in可用于Netscape Navigator和Microsoft Internet Explorer。


J2RE是Java2 Runtime Environment,即Java運行環境,有時簡稱JRE。如果你只需要運行Java程序或Applet,下載並安裝它即可。如果你要自行開發 Java軟件,請下載JDK。在JDK中附帶有JRE。注意由於Microsoft對Java的支持不完全,請不要使用IE自帶的虛擬機來運行 Applet,務必安裝一個JRE或JDK。


一、JRE的版本管理


Java的解決辦法是每個程序自己攜帶一套JRE。


我的机器上已经被安装了好多套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都被各自安裝到不同的目錄,不會互相影響。當在控制台執行java.exe,操作系統尋找JRE的方式如下:


先找當前目錄下有沒有JRE 再找父目錄下有沒有JRE 接着在PATH路徑中找JRE 註冊表HKEY_LOCAL_MACHINESOFTWAREJavaSoftJava Runtime Environment 查看CurrentVersion的鍵值指向哪個JRE


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


.Net Framework的版本管理 


.Net Framework被固定安裝在C:WinntMicrosoft.NETFrameworkv版本號目錄下,並且在同一台機器只能安裝一套,要安裝1.1版本的.Net Framework,就必須先刪除1.0的。聽說剛發行的.Net Framework1.1已經對1.0做了很多改進,甚至基礎類庫的層次也有所變動。看來在舊版本的.Net Framework開發的程序將來往新版本上面遷移的時候少不了修改程序代碼。


二、JRE的基礎類庫


JRE自帶的基礎類庫主要是JRElibrt.jar這個文件,包括了Java2平台標準版的所有類庫。和JRE的版本一致。


.Net Framekwork的核心类库 


.Net Framekwork的核心類庫被放置在C:Winntassemblygac目錄下,按照不同的名稱空間放在不同目錄中,不像JRE打成了一個包。並且可以同時存在不同的版本,例如: 某類庫1.0版本 C:Winntassemblygac名稱1.0名稱.dll 某類庫1.1版本 C:Winntassemblygac名稱1.1名稱.dll


这样做,虽然很灵活,可以随时把类库更新到最新的状态,但是很容易带来版本管理的复杂度,造成版本不一致。 


三、JRE類庫的查找方法和版本管理


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程序当前路径下,或其相对路径中,只有当前程序可见。  共享类库需要在GAC(Global Assembly Cache)中注册,注册过程比较复杂,首先要用工具生成公开/私有密钥对,然后结合密钥和类库版本号连编,最后使用工具注册到GAC中好以后,会被放在"C:Winntassemblygac类库的名称空间版本号"目录下,不同的类库版本在注册的时候会按照版本号分开放置:  ·某类库1.0版本 C:Winntassemblygac名称1.0名称.dll  ·某类库1.1版本 C:Winntassemblygac名称1.1名称.dll 


也就是可以同時存在一個類庫的n個版本,至於在程序中用哪個版本,在程序的配置文件中聲明,CLR會根據聲明來調用相應的版本的類庫。我覺得.Net實現方法未免太複雜了一些,將所有共享類庫都塞到一個系統目錄下,並且同一個類庫還有n個版本,將來.Net第三方開發的類庫逐漸豐富起來以後,.Net類庫的GAC也會越來越龐大,會不會也搞得和Windows註冊表一樣難以維護?軟件發布到服務器上的時候,類庫要再註冊一次,服務器會逐漸形成一個龐大的樹狀的GAC,GAC裡面存放着組件的n個版本。試想經過一段時間之後,C:Winntassemblygac目錄會越來越龐大,有的組件甚至有n個版本都放在那裡,你又不敢隨便刪除,不知道是不是有程序需要使用,我不明白MS為什麼要把這麼簡單的事情搞到這麼複雜?