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

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

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

    posts - 193,  comments - 520,  trackbacks - 0
    Tomcat是接觸最久的應用服務器,同時也被它的classloading愚弄過好多次。印象中比較深的一次是建立了一個web應用,使用oracle數據庫,我把oracle的jdbc driver放到了WEB-INF/lib目錄下面,然后給Tomcat配置了數據源,在這個應用里面連接這個數據源,來訪問數據庫。看起來一切正常,可是一啟動Tomcat,就報出一個錯誤,說是找不到driver類。后來知道這是由于Tomcat的classloading機制造成的。總的來說,Tomcat開源、簡單,文檔清楚,又學習過一陣它的源碼,是我了解最多的應用服務器了,所以就從它開始。
     
          運行Tomcat就是運行org.apache.catalina.startup.Bootstrap類的main方法,和運行普通的應用程序并無二致,所以Java 2的classloading機制適用于這個過程。但是Bootstrap運行起來以后,會加載common、server下面的類,加載webapps下面的web應用。這些類的加載是由不同的classloader來完成的。Tomcat的classloader結構如下:

    BootStrap classloader(加載JRE/lib下的rt.jar和其他重要jar文件)

                                                         é

    ExtClassLoader (加載JRE/lib/ext下的jar文件,Java擴展框架使用)

                                                         é

    AppClassLoader ($CATALINA_HOME/bin/bootstrap.jar commons-logging -api.jarcommons-daemon.jar$JAVA_HOME/lib/tools.jarjmx.jar)

                                       é

    common (加載$CATALINA_HOME/common/Tomcat本身和Web App共享類)

                      é                                                                        é

    Catalina (加載$CATALINA_HOME /server/Tomcat本身使用的類)

    Shared (加載$CATALINA_BASE /shared/,所有Web App共享類)

                                                            é

    WebappClassLoader (加載各個Web Appclass,不同的Web App被隔離開)


    Tomcat在啟動的時候,完全忽略了class path的設置,而重新設置了class path,所以AppClassLoader 載入的類將不是class path設置的類。
     
    Tomcat沒有完全使用Java 2的parent delegation模型。這一點體現在WebappClassLoader上。在一個web app中,載入類的過程是這樣的:
     
    首先檢查本地的WebappClassLoader,如果沒有,
    則請求它的父ClassLoader,即shared。
    從shared開始,采用parent delegation,即shared請求它的父classloader common來載入類,這個過程一直延續到BootStrap classloader。
     

    正是因為這種機制,使我們在兩個Web app中有相同的class的時候,不會相互干擾。比如說,兩個app中都使用了log4j,在WEB-INF/lib下面分別有一份log4j.jar,配置輸出到不同的文件。因為WebappClassLoader僅對本app可見,所以log4j可以獨立工作,而不相互影響。但是,如果我們把這兩個app下面的log4j.jar移動到shared目錄或者common目錄,那他們就會把日志輸出到同樣的文件了,因為這時候是共享的。
     
    記得當時看到WebappClassLoader的這個特性,心下暗喜,盤算著自己能不能寫一個java.lang.String類,放到WEB-INF/lib下面,而得到優先加載的機會呢?馬上興沖沖地進行試驗,但是結果讓我失望,翻出tomcat的源碼一看,發現以java.,javax.,sun.,開頭的class,WebappClassLoader一概不予理會,直接把燙山芋扔給它的父loader了。另外,Tomcat文檔交待,遇到加載org.xml.sax.* ,org.w3c.dom.* ,org.apache.xerces.* ,org.apache.xalan.* 這些包的class的請求,WebappClassLoader也不會受理。

    引用地址:
    http://spaces.msn.com/myj1024/blog/ 
                                    


    http://www.tkk7.com/ronghao 榮浩原創,轉載請注明出處:)
    posted on 2006-03-01 16:55 ronghao 閱讀(2711) 評論(0)  編輯  收藏 所屬分類: 轉載
    <2006年3月>
    2627281234
    567891011
    12131415161718
    19202122232425
    2627282930311
    2345678

    關注工作流和企業業務流程改進。現就職于ThoughtWorks。新浪微博:http://weibo.com/ronghao100

    常用鏈接

    留言簿(38)

    隨筆分類

    隨筆檔案

    文章分類

    文章檔案

    常去的網站

    搜索

    •  

    最新評論

    閱讀排行榜

    評論排行榜

    主站蜘蛛池模板: 中文字幕精品亚洲无线码一区| 一级做a爱片特黄在线观看免费看| 国产亚洲精品资在线| 国产成人免费高清激情视频| 久久久久久成人毛片免费看 | 99在线观看精品免费99| 老司机午夜免费视频| 亚洲欧洲日产国码久在线| 亚洲性一级理论片在线观看| 亚洲精品无码不卡在线播放HE| 国产一级淫片a免费播放口之| 成年网站免费视频A在线双飞| 99视频有精品视频免费观看| 青青操免费在线视频| igao激情在线视频免费| 国产亚洲福利一区二区免费看| 亚洲一区二区三区乱码在线欧洲| 亚洲视频在线观看免费视频| 亚洲av无码成h人动漫无遮挡 | 亚洲a∨无码精品色午夜| 亚洲人成77777在线播放网站不卡 亚洲人成77777在线观看网 | 国产AV无码专区亚洲精品| 亚洲精品国产高清不卡在线| 国产jizzjizz免费看jizz| 精品免费国产一区二区| 在线观看免费成人| 在线jyzzjyzz免费视频| 好男人视频社区精品免费| 搡女人真爽免费视频大全| 无码国产精品一区二区免费I6| 免费看片在线观看| 久草视频在线免费| 黄页网站在线观看免费高清| 国产在线jyzzjyzz免费麻豆| 在线观看AV片永久免费| 色播在线永久免费视频| 日本一区免费电影| 亚洲成AV人在线观看网址| ZZIJZZIJ亚洲日本少妇JIZJIZ | igao激情在线视频免费| 中国人免费观看高清在线观看二区|