The Tomcat 4 Servlet/JSP Container下怎樣裝載類 (轉)

gugu99發表於2007-12-04
The Tomcat 4 Servlet/JSP Container下怎樣裝載類 (轉)[@more@]

以下的規則覆蓋了大約95%的內容,關於開發者和者必須要做的工作,關於在什麼地方放置類和資原始檔來使他們變得有效。

對於那些特定某個應用的類和資原始檔,沒有打包的類和資原始檔放置在你的web應用路徑的/WEB-INF/classe下,或者放置包含那些類和資原始檔的JAR檔案在/WEB-INF/lib下

對於那些為所有的WEB應用所共享的WEB應用類和資原始檔,沒有打包的類和資原始檔放置在$CATALINA_HOME/shared/classes下,或者放置那些包含類和資原始檔JAR包在$CATALINA_HOME/shared/lib的下面。

序言

就像一些服務應用一樣,4一個多樣性的class loaders(就是.lang.Claoader)類來允許容器的不同部分和網站應用執行在這個容器中,允許存取不同的類和資源的倉庫。

在Java 2 (that is, 1.2 or later)環境中,class loaders被安排在一個父子樹中。當一個class loader被要求裝載一個類和資源的時候,他首先指定這個需求到一個父類中,然後尋找自己的需求在這個父類中,如果找不到再接著向下尋找。對於WEB應用的class loader也許或有細微的差別,但是主要的機制都是一樣的。

When Tomcat 4 is started, it creates a set of class loaders that are organized into the following parent-child relationships, where the parent class loader is above the child class loader:

當TOMCAT4啟動的時候,他建立了一套以下父子關係的class loader,並且父類在子類的上面。

 

  Bootstrap

  |

  System

  |

  Common

  / 

 Catalina  Shared

  / 

  Webapp1  Webapp2 ...

 :namespace prefix = o ns = "urn:schemas--com::office" />

 

這些class loaders的每一個特徵(包括類和資源的原始檔)在以下的章節中說明。

Class Loader 定義

就像以上的圖表所顯示的一樣,TOMCAT4在初始化的時候建立以下的class loader:

Bootstrap –這個class loader包含了JAVA虛擬機器提供的基本執行時的環境類,還有任何當前擴充套件路徑($JAVA_HOME//lib/ext)下的JAR檔案。注意-一些JAVA虛擬機器也許需要多個class loader,或者也許不可見。

System –這個class loader通常從CLASSPATH環境變數的內容中初始化。所有這些類對於TOMCAT內部類和WEB應用都是可見的。但是TOMCAT4標準開始指令碼($CATALINA_HOME/bin/catalina.sh 或者 %CATALINA_HOME%bincatalina.bat)完全忽略了他自己的CLASSPATH環境變數的內容,取而代之的是從以下的倉庫中建立系統class loader:

$CATALINA_HOME/bin/bootstrap.jar -包含了初始化TOMCAT4服務的主要方法,和他所依賴的class loader執行類。

$JAVA_HOME/lib/tools.jar -包含了JAVAC,用於把編譯成SEVLET類

 

Common -這個class loader包含了對於TOMCAT4和所有的WEN應用都可見的額外的類。通常,應用類不應該放置到這裡。透過這類的裝載,所有在$CATALINA_HOME/common/classes下的未打包的類和資原始檔和在$CATALINA_HOME/commons/endorsed 和$CATALINA_HOME/common/lib directories下的打包的JAR檔案都可以變得可見。在預設的情況下主要包含了以下的包:

jndi.jar - JAVA命名和路徑介面類(只裝載在JDK1.2系統中,因為在以後的JDK1.3版本中會被自動包含)。

naming-common.jar -被TOMCAT4使用來說明器命名關聯的JNDI實現

naming-res.jar - 用來描述一個WEB應用的靜態在院的專門的JNDI命名關聯實現

.jar - Servlet 和 JSP API類

xerces.jar -在預設的情況下對於TOMCAT內部類和WEB應用可見的XML解析器。對於一個特殊的應用,我們可以在/WEB-INF/lib下包含我們自己的解析器來忽略這個解析器

Catalina -用來實現TOMCAT4初始化的時候包含他自己所有需要的類和資源。這些類和資源對於整個WEB應用是不可見的。所有的未打包的類和資源在$CATALINA_HOME/server/classes下,打包的JAR檔案在$CATALINA_HOME/server/lib。

 

因此,從這個WEB應用的觀點可以看出,類或者資源裝載在以下的倉庫中,就是以下的順序:

/WEB-INF/classes 你的WEB應用

/WEB-INF/lib/*.jar 你的WEB應用

你的JVM Bootstrap類

系統class loader類(以上說明的)

$CATALINA_HOME/common/classes

$CATALINA_HOME/common/endorsed/*.jar

$CATALINA_HOME/common/lib/*.jar

$CATALINA_HOME/shared/classes

$CATALINA_HOME/shared/lib/*.jar

 

類和擴充套件

除了先前的規則,Web應用class loader將拒絕從JAVA語言核心包中裝載("java.*" packages).

XML 解析器 和 JDK 1.4

就象一些其它的改變,JDK1.4釋出了JAAPIS包和Xerces的一個版本。這會影響那些希望使用他們自己的XML解析器。

在先前的TOMCAT4的版本,你可以簡單的在$CATALINA_HOME/common/lib下覆蓋XML解析器來改變所有的WEB應用的解析器。但是,當我們執行在JDK1.4的時候這個技巧不是很有效的,因為通常class loader委託過程總是選擇JDK內部的實現。

JDK1.4透過"Endorsed Standards Overr Mechanism" 來支援建立JCP(i.e. and SAX from )外部的機制。他也別用來XML解析實現。

TOMCAT在命令列開始一個容器的時候,透過包含系統恰當的設定-Djava.endorsed.dirs=$CATALINA_HOME/common/endorsed來呼叫系統的正確設定。因此,你可以取代安裝在這個路徑下的解析器,他甚至在JDK1.4種也會得到應用。


來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/10748419/viewspace-987765/,如需轉載,請註明出處,否則將追究法律責任。

相關文章