weblogic classloader
weblogic中釋出的一個應用一般目錄結構如下

對應的各層級結構如下
application classloader用來加載ejb jars、app-inf/lib、app-inf/classes、ejb jars中classpath變量定制的路徑下的類
web application classloader用來加載war、war中classpath變量定制的路徑下的類。
weblogic下的classloader用的也是委托模型。首先bootstrap先進行尋找,找不到再由extclassloader尋找,然後在由appclassloader一級一級往下找。這樣的分層結構有個好處,就是在jsp,servlet中可以直接通路ejb的接口。這種上層裝載ejb,下層裝載servlet,最下層加載jsp檔案的結構,使得經常變動的jsp,servlet等可以被重新裝載而不會被涉及到ejb層。
weblogic可以通過修改配置檔案weblogic.xml中的prefer-web-inf-classes元素,來修改這種加載順序。預設情況下,該元素設定為 false。将該元素設定為 true 會颠反類加載器委托模型,以便優先加載 web 應用程式中的類定義,其次才加載更高一級的類加載器中的類定義。這使得 web 應用程式能夠使用自己版本的第三方類,這些類也可能包含于 weblogic server 中。請參閱 weblogic.xml 部署描述符元素。
weblogic server 類加載以應用程式的概念為核心。應用程式通常打包為企業歸檔 (ear) 檔案,其中包含應用程式類。ear 檔案中的所有内容均被視為同一個應用程式的組成部分。
下面的内容可以作為ear 的一部分,也可以作為獨立應用程式進行加載:
enterprise javabean (ejb) jar 檔案
web 應用程式 war 檔案
資源擴充卡 rar 檔案
如果分别部署ejb和web應用程式,會将它們視為兩個應用程式。如果将它們一起部署在ear檔案中,則它們是一個應用程式。可以将子產品共同部署于一個ear檔案内,以便系統将它們視為同一個應用程式的各部分。
每個應用程式都接收其自己的類加載器層次結構;該層次結構的父級是系統類路徑類加載器。這可以隔離應用程式,以使應用程式a無法檢視應用程式b的類加載器或類。在層次結構類加載器中,不存在同級或同伴的概念。應用程式代碼隻能看到與該應用程式(或子產品)關聯的類加載器所加載的類,以及應用程式(或子產品)類加載器的父類加載器所加載的類。這允許 weblogic server在同一個jvm中承載多個隔離的應用程式。
應用程式類加載器層次結構
部署應用程式時,weblogic server自動建立類加載器的層次結構。該層次結構的根類加載器将加載應用程式中的所有ejb、jar 檔案。将針對每個web應用程式war檔案建立子類加載器。
由于 web 應用程式通常會調用 ejb,是以 weblogic server 應用程式類加載器體系結構允許 javaserver page (jsp) 檔案和 servlet 檢視其父類加載器中的 ejb 接口。這種體系結構還允許在不重新部署 ejb 層的情況下重新部署 web 應用程式。實際上,通常會更改 jsp 檔案和 servlet,而不更改 ejb 層。
下圖說明此 weblogic server 應用程式類加載的概念。
如果您的應用程式包含使用 ejb 的 servlet 和 jsp:
将 servlet 和 jsp打包在 war 檔案中
将 enterprise javabean打包在 ejb jar 檔案中
将 war 和 jar 檔案打包在 ear 檔案中
部署 ear 檔案
盡管可以分别部署 war 和 jar 檔案,但如果将它們共同部署于 ear 檔案内,則會生成允許 servlet 和 jsp 查找 ejb 類的類加載器安排。如果分别部署 war 和 jar 檔案,weblogic server 将為它們建立同級類加載器。這表明您必須在 war 檔案中包含 ejb home 接口和遠端接口,且 weblogic server 必須針對 ejb 調用使用 rmi 存根和骨架類,如同 ejb 用戶端和實作類位于不同 jvm 中一樣。
參考至:《叱咤風雲:weblogic企業級運維實戰》戴冠平著
http://hi.baidu.com/love200456/blog/item/9d4d70fbdc38c970024f564f.html
如有錯誤,歡迎指正
作者:czmmiao 文章出處:http://czmmiao.iteye.com/blog/1616219