<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是接觸最久的應(yīng)用服務(wù)器,同時(shí)也被它的classloading愚弄過好多次。印象中比較深的一次是建立了一個(gè)web應(yīng)用,使用oracle數(shù)據(jù)庫,我把oracle的jdbc driver放到了WEB-INF/lib目錄下面,然后給Tomcat配置了數(shù)據(jù)源,在這個(gè)應(yīng)用里面連接這個(gè)數(shù)據(jù)源,來訪問數(shù)據(jù)庫??雌饋硪磺姓?,可是一啟動(dòng)Tomcat,就報(bào)出一個(gè)錯(cuò)誤,說是找不到driver類。后來知道這是由于Tomcat的classloading機(jī)制造成的??偟膩碚f,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ī)制適用于這個(gè)過程。但是Bootstrap運(yùn)行起來以后,會(huì)加載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.jar,commons-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 (加載各個(gè)Web Appclass,不同的Web App被隔離開)


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

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

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


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

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

    常用鏈接

    留言簿(38)

    隨筆分類

    隨筆檔案

    文章分類

    文章檔案

    常去的網(wǎng)站

    搜索

    •  

    最新評論

    閱讀排行榜

    評論排行榜

    主站蜘蛛池模板: 亚洲av永久无码精品漫画| 大地资源中文在线观看免费版| 一级毛片免费播放试看60分钟| 无码人妻久久一区二区三区免费丨 | 亚洲欧洲综合在线| 婷婷亚洲综合一区二区| 免费毛片a在线观看67194| 亚洲视频一区在线| 91香蕉国产线观看免费全集| 久久亚洲国产成人亚| 久久久久国色av免费看| 亚洲AV无码乱码在线观看富二代| 黄页网站在线看免费| 一个人看www免费高清字幕| 久久精品蜜芽亚洲国产AV| 免费国产黄网站在线观看可以下载| 亚洲色WWW成人永久网址| 国产精品视频全国免费观看| 亚洲一区二区三区无码影院| 国产线视频精品免费观看视频| 国产aⅴ无码专区亚洲av| 7m凹凸精品分类大全免费| 韩国亚洲伊人久久综合影院| 久久夜色精品国产噜噜亚洲AV| 国产免费怕怕免费视频观看| 九九久久国产精品免费热6 | 亚洲天堂福利视频| 成年男女免费视频网站| 亚洲av无码一区二区三区天堂| www.亚洲精品| 久久精品视频免费| 亚洲国产精品张柏芝在线观看| 亚洲国产精品成人网址天堂| 国产免费一区二区三区不卡 | 亚洲欧洲国产视频| 亚洲精品无码久久久久去q| 三年片在线观看免费大全电影| 污网站在线观看免费| 亚洲av无码精品网站| mm1313亚洲精品国产| 日韩激情淫片免费看|