Leo's Blog

            BlogJava :: 首頁 :: 新隨筆 :: 聯系 :: 聚合  :: 管理 ::
            13 隨筆 :: 3 文章 :: 18 評論 :: 0 Trackbacks
          時間:2005-11-04
          作者:juxtapose


           如果大家對一般類的裝載器熟悉的話,就知道在java中類的裝載采用“代理機制”,即子裝載器如果需要裝載一個類文件,首先會將此任務提交給父 裝載器,如果父裝載器找不到此類文件,才有子裝載器來裝載類文件,如果子裝載器也找不到,那么就會報告ClassNotFoundException異 常。下面簡單談一下我對weblogic server的類裝載器原理的了解,希望能和大家分享。

          1.Weblogic允許定制的類裝載器,同時也有一個默認的類裝載器。其默認的裝載器的結構分層如下:

           

            當部署一個應用的時候,weblogic server會自動創建一個具有層次結構的類裝載器。在圖中,a.Application Classloader負責裝載應用中的所有的EJB JAR文件;

            b.Web Application Classloader負責裝載所有的Web application 中的WAR 文件(所有得jsp文件除外);

            c.Jsp Classloader 負責裝載Web application 中的所有的jsp 文件;

            這樣的分層結構有一個好處,就是在Jsp,Servlet中可以直接訪問EJB的接口。這種上層裝載EJB,下層裝載servlet等,最下面裝載jsp文件的結構,使得經常變動的jsp,servlet等可以被重新裝載而不會涉及到EJB層。

          在這種默認的類裝載器結構下,有一點需要提出的是:

            a. 我們的應用必須打包成一個EAR文件,才會允許我們應用中的jsp和servlet文件直接訪問ejb;如果將WAR與JAR文件分別打包。 Weblogic server會為他們分別生成一個類裝載器,作為兄弟節點,這時如果需要在jsp或者servlet中使用ejb,就必須將EJB的Home接口與 remote接口打包到WAR中才可以。后面這種情況,適合用在將EJB的客戶端和EJB部署在不同的JVM中;

            b.web application classloader中,不會裝載jsp文件,jsp文件由web application classloader的子裝載器Jsp classloader負責裝載,因為jsp文件經常的變動,通過為jsp設立一個單獨的classloader可以避免對jsp的裝載影響到其他的 java class或者ejb;

          默認裝載器的優點:

            a. 調用ejb的時候可以采用call-by-referrence的方式;

            b. 允許web module獨立的裝載,不影響其它的web module;

          • 通過在將整個應用打包成一個EAR文件,可以方便的不用再web module中包含EJB的home和remote接口,就可以方便的通過call-by-referrence來調用ejb;

          2. 定制classloader
            如果覺得默認的類裝載器不能滿足需要,weblogic server支持定制的類裝載器。在weblogic的文檔中指出,自定義的classloader多用于開發者使用,當應用發布之后,不推薦使用。自定 義的類裝載器通過xml文件來描述。描述文件放在weblogic-application.xml中。Weblogic官方提供的DTD描述文件如下:

          <classloader-structure> 
              
          <module-ref> 
                  
          <module-uri>ejba.jar</module-uri> 
              
          </module-ref> 
              
          <module-ref> 
                  
          <module-uri>webc.war</module-uri> 
              
          </module-ref>
              
          <classloader-structure> 
                  
          <module-ref> 
                      
          <module-uri>weba.war</module-uri> 
                  
          </module-ref> 
              
          </classloader-structure>
              
          <classloader-structure> 
                  
          <module-ref> 
                      
          <module-uri>ejbc.jar</module-uri> 
                  
          </module-ref> 
                  
          <module-ref> 
                      
          <module-uri>webb.war</module-uri> 
                  
          </module-ref>
                  
          <classloader-structure> 
                      
          <module-ref> 
              
          <module-uri>webd.war</module-uri> 
                      
          </module-ref> 
                  
          </classloader-structure> 
                  
          <classloader-structure> 
                      
          <module-ref> 
              
          <module-uri>ejbb.jar</module-uri> 
                      
          </module-ref> 
                  
          </classloader-structure>
              
          </classloader-structure>
          </classloader-structure>

            通過我們給出的配置文件,我們自定義的classloader的層次結構如下圖:

           

            在J2EE的規范中明確的指出,J2EE應用不應該依賴于任一個給定的類裝載器。所以,我們自定義的類裝載器,在開發過程中還是可以使用的,但一定不要應用于發布后的應用中。

          自定義的類裝載器有如下得限制:
            a.不能夠裝載servlet;

            b.嵌套的深度最大為3,也就是說,最多只能夠嵌套三層;

            c.自定義裝載器的module類型僅限于 Web和 EJB這兩種;

            d.Jsp Classloader不受此自定義類裝載器的影響,它永遠都是web module的子類裝載器;

          • 相同的類可能導致部署異常;
          • 在自定義的類裝載器中,如果要使用EJB,就必須將EJB的home和remote接口打包到相應的web module中去;
          •  

          3.Ejb的單獨加載
            
          有時候我們可能需要單獨加載某個EJB,這個時候我們可以通過以下兩種方法來實現:

            第一:將應用需要的jar文件放在APP-INF/lib中,或者將類文件放在APP-INF/classes中,這些類文件和JAR文件會被root classloader進行裝載,可以被多個應用共享;

            第二:可以通過META-INF/MANIFEST.MF文件來指定需要的classes。通常的用法是在META-INF/MANIFEST.MF文件中增加Class-Path:一行。舉例如下:

            Class-Path:/d:ejb/add.jar

            這樣就會在當前的jar包中可以找到我們需要的add.jar文件。需要說明的是,在Class-Path:行的最后一定要有一個換行,否則會發生錯誤。還有,通過Class-Path只能指定本地的JAR文件。

            如果能對應用服務器的類裝載原理有了較清楚地了解,會對我們的應用移植,在開發中避免不必要的類裝載的錯誤會有很大的幫助。

          轉載自:http://dev2dev.bea.com.cn/bbsdoc/20051104121.html

          posted on 2006-02-23 18:37 Leo 閱讀(395) 評論(0)  編輯  收藏 所屬分類: 技術隨文
          主站蜘蛛池模板: 建水县| 山西省| 富锦市| 米泉市| 禹州市| 铜鼓县| 昭觉县| 保德县| 东平县| 北流市| 九龙坡区| 锡林浩特市| 边坝县| 牙克石市| 大丰市| 大庆市| 涞水县| 洪洞县| 屯门区| 仪陇县| 宿松县| 康保县| 龙山县| 土默特左旗| 中宁县| 荔浦县| 敖汉旗| 澄江县| 新巴尔虎左旗| 抚顺市| 廉江市| 南郑县| 双鸭山市| 宝兴县| 阿图什市| 泰安市| 万宁市| 横山县| 怀柔区| 鄂尔多斯市| 万载县|