本文講述了Tomcat的classloading的邏輯。?
1. 之所以要講Classloading的事情,關(guān)鍵還是解決在開發(fā)過(guò)程中碰到的class找不到,一些資源文件找不到的問(wèn)題。要解決這樣的問(wèn)題,就必須理解Tomcat的classloader會(huì)到什么地方去找class,找資源。?
2. 首先是一個(gè)總結(jié),告訴我們應(yīng)該怎樣防止自己的class和資源:?
(1) For classes and resources specific to a particular web application, place unpacked classes and resources under /WEB-INF/classes of your web application archive, or place JAR files containing those classes and resources under /WEB-INF/lib of your web application archive.?
(2) For classes and resources that must be shared across all web applications, place unpacked classes and resources under $CATALINA_BASE/shared/classes, or place JAR files containing those classes and resources under $CATALINA_BASE/shared/lib.?
大體的意思就是,如果資源和class文件只是for一個(gè)web app的,那么請(qǐng)把class文件,資源文件放到/WEB-INF/classes目錄下,如果已經(jīng)將class或資源文件打成了jar包,或是一些第三方的jar包,請(qǐng)放到/WEB-INF/lib目錄下;如果這些class和資源文件要共享給其他的web app,請(qǐng)把他們放到$CATALINA_BASE/shared/classes, $CATALINA_BASE/shared/lib目錄下。這里,$CATALINA_BASE一般就是$CATALINA_HOME,只不過(guò)的當(dāng)我們啟動(dòng)了多個(gè)Tomcat的時(shí)候,需要用到$CATALINA_BASE,因?yàn)槎鄠€(gè)Tomcat他們的$CATALINA_HOME不一定一樣。?
3. 然后文章就詳細(xì)描述了Tomcat的一些classloader,和他們的邏輯,從而也就解釋了上面的總結(jié),可以看到最后的webappx這種classesloader就會(huì)負(fù)責(zé)load某個(gè)webapp中的資源,而有一個(gè)叫做Shared的classloader就會(huì)load放在$CATALINA_BASE/shared目錄下的資源。這就是為什么我們把東西放在這些地方就能被發(fā)現(xiàn)和load的原因。具體可以看本文檔,講的很詳細(xì),包括Tomcat下面common目錄下的東西是由哪個(gè)classloader load的(就是一個(gè)名為Common的classloader),等等。比如那個(gè)名為Catalina的classloader就負(fù)責(zé)load tomcat自己的classes,所以這個(gè)classloader對(duì)于webapp來(lái)說(shuō)是不可見(jiàn)的。這里就是Tomcat中的classloader的關(guān)系圖:?
1. 之所以要講Classloading的事情,關(guān)鍵還是解決在開發(fā)過(guò)程中碰到的class找不到,一些資源文件找不到的問(wèn)題。要解決這樣的問(wèn)題,就必須理解Tomcat的classloader會(huì)到什么地方去找class,找資源。?
2. 首先是一個(gè)總結(jié),告訴我們應(yīng)該怎樣防止自己的class和資源:?
(1) For classes and resources specific to a particular web application, place unpacked classes and resources under /WEB-INF/classes of your web application archive, or place JAR files containing those classes and resources under /WEB-INF/lib of your web application archive.?
(2) For classes and resources that must be shared across all web applications, place unpacked classes and resources under $CATALINA_BASE/shared/classes, or place JAR files containing those classes and resources under $CATALINA_BASE/shared/lib.?
大體的意思就是,如果資源和class文件只是for一個(gè)web app的,那么請(qǐng)把class文件,資源文件放到/WEB-INF/classes目錄下,如果已經(jīng)將class或資源文件打成了jar包,或是一些第三方的jar包,請(qǐng)放到/WEB-INF/lib目錄下;如果這些class和資源文件要共享給其他的web app,請(qǐng)把他們放到$CATALINA_BASE/shared/classes, $CATALINA_BASE/shared/lib目錄下。這里,$CATALINA_BASE一般就是$CATALINA_HOME,只不過(guò)的當(dāng)我們啟動(dòng)了多個(gè)Tomcat的時(shí)候,需要用到$CATALINA_BASE,因?yàn)槎鄠€(gè)Tomcat他們的$CATALINA_HOME不一定一樣。?
3. 然后文章就詳細(xì)描述了Tomcat的一些classloader,和他們的邏輯,從而也就解釋了上面的總結(jié),可以看到最后的webappx這種classesloader就會(huì)負(fù)責(zé)load某個(gè)webapp中的資源,而有一個(gè)叫做Shared的classloader就會(huì)load放在$CATALINA_BASE/shared目錄下的資源。這就是為什么我們把東西放在這些地方就能被發(fā)現(xiàn)和load的原因。具體可以看本文檔,講的很詳細(xì),包括Tomcat下面common目錄下的東西是由哪個(gè)classloader load的(就是一個(gè)名為Common的classloader),等等。比如那個(gè)名為Catalina的classloader就負(fù)責(zé)load tomcat自己的classes,所以這個(gè)classloader對(duì)于webapp來(lái)說(shuō)是不可見(jiàn)的。這里就是Tomcat中的classloader的關(guān)系圖:?
?
Bootstrap
?????????????|
???????System
?????????????|
???????Common
?????????/??????\
Catalina????Shared
??????????????????/????\
????????Webapp1??Webapp2?...
?????????????|
???????System
?????????????|
???????Common
?????????/??????\
Catalina????Shared
??????????????????/????\
????????Webapp1??Webapp2?...
?
? 4. 最后文檔給出了一個(gè)非常有用的東西,也就是對(duì)于一個(gè)web app來(lái)說(shuō),tomcat是按照如下順序來(lái)尋找class和資源的:?
-
Bootstrap classes of your JVM?
System class loader classses (described above)?
/WEB-INF/classes of your web application?
/WEB-INF/lib/*.jar of your web application?
$CATALINA_HOME/common/classes?
$CATALINA_HOME/common/endorsed/*.jar?
$CATALINA_HOME/common/i18n/*.jar?
$CATALINA_HOME/common/lib/*.jar?
$CATALINA_BASE/shared/classes?
$CATALINA_BASE/shared/lib/*.jar
更多文章、技術(shù)交流、商務(wù)合作、聯(lián)系博主
微信掃碼或搜索:z360901061

微信掃一掃加我為好友
QQ號(hào)聯(lián)系: 360901061
您的支持是博主寫作最大的動(dòng)力,如果您喜歡我的文章,感覺(jué)我的文章對(duì)您有幫助,請(qǐng)用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點(diǎn)擊下面給點(diǎn)支持吧,站長(zhǎng)非常感激您!手機(jī)微信長(zhǎng)按不能支付解決辦法:請(qǐng)將微信支付二維碼保存到相冊(cè),切換到微信,然后點(diǎn)擊微信右上角掃一掃功能,選擇支付二維碼完成支付。
【本文對(duì)您有幫助就好】元
