(這個編輯工具不太會用,樣式難看點,湊合看了)每個容器都有自己的類加載器,在默認情況下都是StandardClassLoader的實例。委托機制也和標準的java實現沒什么兩樣。接著往下看項目對應的類加載StandardContext.start();調用WebappLoader.start()開始加載項目,WebappLoader又通過創建一個WebappClassLoader實例進行類加載。WebappClassLoader.loadClass()實現依然波瀾不驚,規規矩矩的先從緩存找,找不到調用findClass()進行加載。果然這里實現有點不同,是先自己找,找不到再委托上級查找。和java默認的加載方式不同。見源代碼,只留下原理部分,日志和調試信息都去掉了。
據此可以認為,在web項目WEB-INF\lib下的jar包優先級高于jboss,tomcat 下的lib.兩處版本不一致的話會導致程序異常。比較省事的辦法是WEB-INF\lib下不再保留重復的jar包,實在閑著沒事的話可以自己寫個類加載器替換tomcat下WebappClassLoader改變加載順序。但是還可能有隱患,WebappClassLoader權限較低,它加載的類只能訪問web應用下的資源,如果servlet-api.jar等包用到其他資源時可能出現異常。這個沒實際測過,只是推測。但是catalina要提供對整個容器的支持,servlet-api實現對http協議的封裝轉換用到外部資源的可能性很大。圖三 類加載器結構圖總結:sevlet-api.jar,jsp-api.jar,el-api.jar這類容器提供的jar包web項目下沒必要再保留一份了,容易出現版本不一致。附錄:查看tomcat源碼的時候可以看看how tomcat works這本書,很不錯,雖然老了點。作者:zyskm http://m.tkk7.com/zyskm
posted on 2011-12-06 13:43 zyskm 閱讀(10714) 評論(3) 編輯 收藏
講得不錯 學習了 回復 更多評論
linux的就是強大。 回復 更多評論
這內容跟linux沒啥關系呀@雪地靴 回復 更多評論
Powered by: BlogJava Copyright © zyskm