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

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

                                                               é

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

                                                               é

          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的設(shè)置,而重新設(shè)置了class path,所以AppClassLoader 載入的類將不是class path設(shè)置的類。
           
          Tomcat沒有完全使用Java 2的parent delegation模型。這一點(diǎn)體現(xiàn)在WebappClassLoader上。在一個web app中,載入類的過程是這樣的:
           
          首先檢查本地的WebappClassLoader,如果沒有,
          則請求它的父ClassLoader,即shared。
          從shared開始,采用parent delegation,即shared請求它的父classloader common來載入類,這個過程一直延續(xù)到BootStrap classloader。
           

          正是因為這種機(jī)制,使我們在兩個Web app中有相同的class的時候,不會相互干擾。比如說,兩個app中都使用了log4j,在WEB-INF/lib下面分別有一份log4j.jar,配置輸出到不同的文件。因為WebappClassLoader僅對本app可見,所以log4j可以獨(dú)立工作,而不相互影響。但是,如果我們把這兩個app下面的log4j.jar移動到shared目錄或者common目錄,那他們就會把日志輸出到同樣的文件了,因為這時候是共享的。
           
          記得當(dāng)時看到WebappClassLoader的這個特性,心下暗喜,盤算著自己能不能寫一個java.lang.String類,放到WEB-INF/lib下面,而得到優(yōu)先加載的機(jī)會呢?馬上興沖沖地進(jìn)行試驗,但是結(jié)果讓我失望,翻出tomcat的源碼一看,發(fā)現(xiàn)以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.aygfsteel.com/ronghao 榮浩原創(chuàng),轉(zhuǎn)載請注明出處:)
          posted on 2006-03-01 16:55 ronghao 閱讀(2716) 評論(0)  編輯  收藏 所屬分類: 轉(zhuǎn)載
          <2006年3月>
          2627281234
          567891011
          12131415161718
          19202122232425
          2627282930311
          2345678

          關(guān)注工作流和企業(yè)業(yè)務(wù)流程改進(jìn)。現(xiàn)就職于ThoughtWorks。新浪微博:http://weibo.com/ronghao100

          常用鏈接

          留言簿(38)

          隨筆分類

          隨筆檔案

          文章分類

          文章檔案

          常去的網(wǎng)站

          搜索

          •  

          最新評論

          閱讀排行榜

          評論排行榜

          主站蜘蛛池模板: 永兴县| 鄱阳县| 高台县| 迁安市| 祁门县| 手机| 池州市| 库伦旗| 英德市| 林西县| 阿图什市| 怀化市| 金秀| 建阳市| 民权县| 全州县| 盐边县| 隆子县| 洛隆县| 广元市| 民县| 凤凰县| 嘉峪关市| 萨嘎县| 高唐县| 山东省| 东城区| 镇坪县| 兖州市| 阳朔县| 融水| 平果县| 吴桥县| 南投县| 驻马店市| 瑞丽市| 满城县| 原平市| 龙海市| 德兴市| 武鸣县|