1. 程式人生 > >Weblogic啟動時classloader載入順序

Weblogic啟動時classloader載入順序

前言

1.weblogic的classloader裝載策略及部署應用的目錄結構

目錄結構
在weblogic上要釋出一個web applicate必須有下面的目錄結構:
mywebapp
  |____WEB-INF
          |___lib            //放這個web application所需要的jar包
          |___classes        //放class類
          |___web.xml        //對這個web application描述
 
 
釋出一個application需要有下面的目錄結構:
myapplication
   |___APP-INF        //放在這個目錄下的lib和classes不能例項化webapp下的類
   |     |___lib      //放ejb和webapp公用的jar包      
   |     |___classes  //放ejb和webapp公用的類
   |___META-INF
   |     |__application.xml
   |___mywebapp
   |     |____WEB-INF
   |            |___lib             
   |            |___classes         //放class類
   |            |___web.xml
   |___ejb.jar     //ejb的jar包
==================================================================================


p s: classloader

classloader是分層次的,它只能載入比它層次高的類及它自身的類,同層次的類及比它層次低的類都不能載入。(1. 父類載入器和子類載入器之間的關係類似於Java中,父類和子類之間的物件關係;      2. Weblogic會將所有load到的class快取到cache中。(子類classloader能看到父類classloader載入到cache中的class)。) 在weblogic中的classloader有5個層次,從高到低排: a.  jdk b. jdk ext c. system classpath d. (APP-INF/lib and APP-INF/classes)
e. (WEB-INF/lib and WEB-INF/classes) f. ejb.jar 注意:e 和 f 的classloader是同級的。 所以APP-INF/lib和APP-INF/classes下類不能例項化webapp下的類,這點尤其要注意,否則會報類找不到的錯誤。 2. 預設情況下,當我們的應用程式(ear,war)執行時,會先去cache中查詢class,如果找不到。就去System Classpath loader 裡去找class。如果System Classpath loader裡能找到你需要的類,那麼不好意思,你在ear和war包裡包含的class就沒用了。如果System ClassPath Loader找不到,接下來去ear的class path裡找,接著去EJB class path裡找,最後到war的class path裡找。一旦找到了該類,就會load起這個類,並將該類放入cache中。 

總的來說,Weblogic的ClassLoader有如下幾個層次,按照從高到低順序排列: 
 1. JDK Classloader 
 2. JDK ext Class Loader 
 3. Weblogic System Class Loader 
 4. Domain Class Loader(Child of System Class Loader) 
 5. App Class Loader  (負責裝載應用中的所有的EJB JAR檔案)
 6. Web Class Loader  (負責裝載所有的Web application 中的WAR檔案(所有得jsp檔案除外)
 7. JSP Class Loader  (負責裝載Web application 中的所有的jsp檔案)
 

若要修改它的載入順序,可以通過在Weblogic.xml(版本為8)中加入以下程式碼:
    <container-descriptor> 
       <prefer-web-inf-classes> true </prefer-web-inf-classes> 
    </container-descriptor> 

總結一下:

在Weblogic服務啟動的過程中,自動形成一個具有層次結構的類裝載器,首先裝載jdk及java擴充套件jar包或類;然後再載入Weblogic本身使用的各個jar包或類;然後再載入Web應用資料夾裡面的classes下的類,然後再載入Web應用資料夾裡面lib下的jar包或類。也就是說,每個層次的類裝載器均對應不同的類路徑,它們是一一對應的。 比如System裝載器對應著jdk及擴充套件路徑;Application裝載器對應著Weblogic的相關類;而web 應用裝載器對應著webapp應用下的classes和lib下的路徑;而jsp裝載器則對應著jsp檔案。
ps: 我們常常使用軟連結的形式進行j a r 包的放置: WEB-INF>l lib
lrwxrwxrwx    1               15  4月16 2014   lib -> ../../../weblib
bea/domain01>l lib
lrwxrwxrwx    1                9  4月16 2014   lib -> ../../lib