本文講述了Tomcat的classloading的邏輯。?
1. 之所以要講Classloading的事情,關鍵還是解決在開發過程中碰到的class找不到,一些資源文件找不到的問題。要解決這樣的問題,就必須理解Tomcat的classloader會到什么地方去找class,找資源。?
2. 首先是一個總結,告訴我們應該怎樣防止自己的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一個web app的,那么請把class文件,資源文件放到/WEB-INF/classes目錄下,如果已經將class或資源文件打成了jar包,或是一些第三方的jar包,請放到/WEB-INF/lib目錄下;如果這些class和資源文件要共享給其他的web app,請把他們放到$CATALINA_BASE/shared/classes, $CATALINA_BASE/shared/lib目錄下。這里,$CATALINA_BASE一般就是$CATALINA_HOME,只不過的當我們啟動了多個Tomcat的時候,需要用到$CATALINA_BASE,因為多個Tomcat他們的$CATALINA_HOME不一定一樣。?
3. 然后文章就詳細描述了Tomcat的一些classloader,和他們的邏輯,從而也就解釋了上面的總結,可以看到最后的webappx這種classesloader就會負責load某個webapp中的資源,而有一個叫做Shared的classloader就會load放在$CATALINA_BASE/shared目錄下的資源。這就是為什么我們把東西放在這些地方就能被發現和load的原因。具體可以看本文檔,講的很詳細,包括Tomcat下面common目錄下的東西是由哪個classloader load的(就是一個名為Common的classloader),等等。比如那個名為Catalina的classloader就負責load tomcat自己的classes,所以這個classloader對于webapp來說是不可見的。這里就是Tomcat中的classloader的關系圖:?
1. 之所以要講Classloading的事情,關鍵還是解決在開發過程中碰到的class找不到,一些資源文件找不到的問題。要解決這樣的問題,就必須理解Tomcat的classloader會到什么地方去找class,找資源。?
2. 首先是一個總結,告訴我們應該怎樣防止自己的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一個web app的,那么請把class文件,資源文件放到/WEB-INF/classes目錄下,如果已經將class或資源文件打成了jar包,或是一些第三方的jar包,請放到/WEB-INF/lib目錄下;如果這些class和資源文件要共享給其他的web app,請把他們放到$CATALINA_BASE/shared/classes, $CATALINA_BASE/shared/lib目錄下。這里,$CATALINA_BASE一般就是$CATALINA_HOME,只不過的當我們啟動了多個Tomcat的時候,需要用到$CATALINA_BASE,因為多個Tomcat他們的$CATALINA_HOME不一定一樣。?
3. 然后文章就詳細描述了Tomcat的一些classloader,和他們的邏輯,從而也就解釋了上面的總結,可以看到最后的webappx這種classesloader就會負責load某個webapp中的資源,而有一個叫做Shared的classloader就會load放在$CATALINA_BASE/shared目錄下的資源。這就是為什么我們把東西放在這些地方就能被發現和load的原因。具體可以看本文檔,講的很詳細,包括Tomcat下面common目錄下的東西是由哪個classloader load的(就是一個名為Common的classloader),等等。比如那個名為Catalina的classloader就負責load tomcat自己的classes,所以這個classloader對于webapp來說是不可見的。這里就是Tomcat中的classloader的關系圖:?
?
Bootstrap
?????????????|
???????System
?????????????|
???????Common
?????????/??????\
Catalina????Shared
??????????????????/????\
????????Webapp1??Webapp2?...
?????????????|
???????System
?????????????|
???????Common
?????????/??????\
Catalina????Shared
??????????????????/????\
????????Webapp1??Webapp2?...
?
? 4. 最后文檔給出了一個非常有用的東西,也就是對于一個web app來說,tomcat是按照如下順序來尋找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
更多文章、技術交流、商務合作、聯系博主
微信掃碼或搜索:z360901061

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