天天看點

JRE是什麼

JRE(Java Runtime Environment,Java運作環境),運作JAVA程式所必須的環境的集合,包含JVM标準實作及Java核心類庫。

目錄

<dl></dl>

<dd></dd>

相關介紹

版本管理

基礎類庫

類庫的查找方法

<dd>類庫管理機制</dd>

  JRE為JavaRunTimeEnvironment的簡稱,JavaRuntimeEnvironment(包括JavaPlug-in)是Sun的産品,包括兩部分:JavaRuntimeEnvironment和JavaPlug-in。JavaRuntimeEnvironment(JRE)是可以在其上運作、測試和傳輸應用程式的Java平台。它包括Java虛拟機、Java平台核心類和支援檔案。它不包含開發工具--編譯器、調試器和其它工具。JRE需要輔助軟體--JavaPlug-in--以便在浏覽器中運作applet。

  JavaPlug-in軟體允許JavaApplet和JavaBeans元件在使用Sun的JavaRuntimeEnvironment(JRE)的浏覽器中運作,而不是在使用預設的Java運作環境的浏覽器中運作。JavaPlug-in可用于NetscapeNavigator和Microsoft Internet Explorer。

  J2RE是Java2 Runtime Environment,即Java運作環境,有時簡稱JRE。如果你隻需要運作Java程式或Applet,下載下傳并安裝它即可。如果你要自行開發 Java軟體,請下載下傳JDK。在JDK中附帶有JRE。注意由于Microsoft對Java的支援不完全,請不要使用IE自帶的虛拟機來運作 Applet,務必安裝一個JRE或JDK。

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

  比如說某人的機器上已經被安裝了好多套JRE和JDK(JDK包括了同版本的JRE,此外還包括有編譯器和其它工具),它們分别是:

  BEA Weblogic Server 7.0 自帶一套 JDK1.3.1_02, 還下載下傳了一套最新的JDK1.4.1_02

  JBuilder9自帶一套JDK1.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_MACHINE\SOFTWARE\JavaSoft\Java Runtime Environment\ 檢視CurrentVersion的鍵值指向哪個JRE

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

  Net Framework的版本管理

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

  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程式目前路徑下,或其相對路徑中,隻有目前程式可見。

  共享類庫需要在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

  也就是可以同時存在一個類庫的n個版本,至于在程式中用哪個版本,在程式的配置檔案中聲明,CLR會根據聲明來調用相應的版本的類庫。我覺得.Net實作方法未免太複雜了一些,将所有共享類庫都塞到一個系統目錄下,并且同一個類庫還有n個版本,将來.Net第三方開發的類庫逐漸豐富起來以後,.Net類庫的GAC也會越來越龐大,會不會也搞得和Windows系統資料庫一樣難以維護?軟體釋出到伺服器上的時候,類庫要再注冊一次,伺服器會逐漸形成一個龐大的樹狀的GAC,GAC裡面存放着元件的n個版本。試想經過一段時間之後,C:\Winnt\assembly\gac\目錄會越來越龐大,有的元件甚至有n個版本都放在那裡,你又不敢随便删除,不知道是不是有程式需要使用,我不明白MS為什麼要把這麼簡單的事情搞到這麼複雜?