<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    zyskm用夢想丈量人生,用奔跑丈量激情

    tomcat類加載器及jar包沖突問題分析

    開發(fā)過程中遇到過這樣一個情況,在本地tomcat下開發(fā)調(diào)試正常,打包到測試環(huán)境的jboss下所有頁面都變成空白頁。
    項目日志和jboss日志沒有一點異常信息,費了半天勁把jboss所有日志全部打出來,發(fā)現(xiàn)是el.jar這個包里有空指針調(diào)用。
    檢查一下,項目WEB-INF\lib里有這個包呀,那應該是跟什么地方的jar包版本沖突了猜想,繼續(xù)找,在jboss-4.0.5.GA\server\default\lib下找到了對應包,比較了一下版本果然版本不一樣。
    把項目下的el-api.jar,jsp-api.jar,servlet-api.jar刪除,重新啟動,問題解決。
    接著有同事提出,同樣在tomcat下開發(fā)也出現(xiàn)這種情況,經(jīng)檢查是他本地tomcat版本跟大家的不一致。開發(fā)環(huán)境這地方?jīng)]做到很好的統(tǒng)一。

    這樣問題是解決了,但是有一點就想不明白了,按照java的類加載委托機制,推測應該是先從jboss-4.0.5.GA\server\default\lib加載,如果加載不到的話再用當前類加載器加載WEB-INF\lib下的jar包,所有如果jboss下有jar包WEB-INF\lib下的應該不起作用,也有不會有沖突了。
    難到情況不是這樣的?

    一直想著找tomcat源碼分析一下來著,拖了好久。趕上這兩天不忙,就把apache-tomcat-6.0.33-src源文件弄了一份,debug看看到底怎樣。
    tomcat的類加載器結(jié)構(gòu)和其他java項目是一致的。見圖一


    圖一
    其類圖見圖二

    圖二
    elipse debug截圖倒過來看跟這個就一樣了。
    Tomcat 通過Lifecycle接口來實現(xiàn)容器生命周期的統(tǒng)一管理,跟類加載器關(guān)系不大,這里就不討論了。
    通過這樣大容器啟動的時候啟動子容器,逐級加載。其結(jié)構(gòu)關(guān)系跟server.xml描述的基本一致,詳細可以參考我的上一篇文章

    Tomcat6結(jié)構(gòu)分析
    http://www.tkk7.com/zyskm/archive/2011/10/24/361870.html

    (這個編輯工具不太會用,樣式難看點,湊合看了)
    每個容器都有自己的類加載器,在默認情況下都是StandardClassLoader的實例。
    委托機制也和標準的java實現(xiàn)沒什么兩樣。

    接著往下看項目對應的類加載
    StandardContext.start();調(diào)用WebappLoader.start()開始加載項目,WebappLoader又通過創(chuàng)建一個WebappClassLoader實例進行類加載。
    WebappClassLoader.loadClass()實現(xiàn)依然波瀾不驚,規(guī)規(guī)矩矩的先從緩存找,找不到調(diào)用findClass()進行加載。
    果然這里實現(xiàn)有點不同,是先自己找,找不到再委托上級查找。和java默認的加載方式不同。
    見源代碼,只留下原理部分,日志和調(diào)試信息都去掉了。

    public Class findClass(String name) throws ClassNotFoundException {
            
    // 先自己加載類,找不到則請求parent來加載,注意這點和java默認的委托模式不同
            Class clazz = null;
            
    try {
                
    if ((clazz == null)) {
                        clazz 
    = findClassInternal(name);
                }

                
    if ((clazz == null&& hasExternalRepositories && !searchExternalFirst) {
                        clazz 
    = super.findClass(name);
                }

                
    if (clazz == null{
                    
    throw new ClassNotFoundException(name);
                }

            }
     catch (ClassNotFoundException e) {
                
    if (log.isTraceEnabled())
                    log.trace(
    "    --> Passing on ClassNotFoundException");
                
    throw e;
            }

            
    return (clazz);
    }

    據(jù)此可以認為,在web項目WEB-INF\lib下的jar包優(yōu)先級高于jboss,tomcat 下的lib.
    兩處版本不一致的話會導致程序異常。
    比較省事的辦法是WEB-INF\lib下不再保留重復的jar包,實在閑著沒事的話可以自己寫個類加載器替換tomcat下WebappClassLoader改變加載順序。
    但是還可能有隱患,WebappClassLoader權(quán)限較低,它加載的類只能訪問web應用下的資源,如果servlet-api.jar等包用到其他資源時可能出現(xiàn)異常。
    這個沒實際測過,只是推測。但是catalina要提供對整個容器的支持,servlet-api實現(xiàn)對http協(xié)議的封裝轉(zhuǎn)換用到外部資源的可能性很大。


    圖三 類加載器結(jié)構(gòu)圖

    總結(jié):
    sevlet-api.jar,jsp-api.jar,el-api.jar這類容器提供的jar包web項目下沒必要再保留一份了,容易出現(xiàn)版本不一致。

    附錄:
    查看tomcat源碼的時候可以看看how tomcat works這本書,很不錯,雖然老了點。

    作者:zyskm
    http://www.tkk7.com/zyskm

    posted on 2011-12-06 13:43 zyskm 閱讀(10737) 評論(3)  編輯  收藏

    評論

    # re: tomcat類加載器及jar包沖突問題分析 2011-12-07 08:49 tb

    講得不錯 學習了   回復  更多評論   

    # re: tomcat類加載器及jar包沖突問題分析 2011-12-07 17:07 雪地靴

    linux的就是強大。  回復  更多評論   

    # re: tomcat類加載器及jar包沖突問題分析 2011-12-08 15:12 zyskm

    這內(nèi)容跟linux沒啥關(guān)系呀@雪地靴
      回復  更多評論   


    只有注冊用戶登錄后才能發(fā)表評論。


    網(wǎng)站導航:
     
    主站蜘蛛池模板: 久久青草免费91线频观看不卡| 久久精品乱子伦免费| 182tv免费观看在线视频 | 免费毛片毛片网址| 你好老叔电影观看免费| 18禁男女爽爽爽午夜网站免费| 久久亚洲国产成人亚| 最新亚洲精品国偷自产在线| 国产精品亚洲一区二区三区 | 亚洲日韩小电影在线观看| 亚洲一二成人精品区| 亚洲暴爽av人人爽日日碰| 福利免费在线观看| 日韩毛片免费无码无毒视频观看| 亚洲成A人片在线观看中文 | 国产黄色片在线免费观看| 亚洲色婷婷一区二区三区| 久久久久免费精品国产| 亚洲A∨午夜成人片精品网站| 亚洲欧洲高清有无| 国产又黄又爽胸又大免费视频 | 免费吃奶摸下激烈视频| 精品亚洲国产成AV人片传媒| 亚洲一级毛片免费在线观看| 亚洲人成伊人成综合网久久久| 嫩草成人永久免费观看| 亚洲人成高清在线播放| 免费观看久久精彩视频| 亚洲婷婷综合色高清在线| 日韩免费在线观看视频| 亚洲a级成人片在线观看| 国产成人精品一区二区三区免费 | 亚洲AV永久无码精品放毛片| 1000部国产成人免费视频| 亚洲欧美乱色情图片| 成人五级毛片免费播放| 亚洲欧洲自拍拍偷午夜色| 国产免费观看网站| 国产成人亚洲精品电影| 亚洲AV无码国产丝袜在线观看| 成人国产精品免费视频|