Tomcat的class加載的優先順序一覽
1.最先是$JAVA_HOME/jre/lib/ext/下的jar文件。
2.環境變量CLASSPATH中的jar和class文件。
3.$CATALINA_HOME/common/classes下的class文件。
4.$CATALINA_HOME/commons/endorsed下的jar文件。
5.$CATALINA_HOME/commons/i18n下的jar文件。
6.$CATALINA_HOME/common/lib?下的jar文件。
(JDBC驅動之類的jar文件可以放在這里,這樣就可以避免在server.xml配置好數據源卻出現找不到JDBC?Driver的情況。)
7.$CATALINA_HOME/server/classes下的class文件。
8.$CATALINA_HOME/server/lib/下的jar文件。
9.$CATALINA_BASE/shared/classes?下的class文件。
10.$CATALINA_BASE/shared/lib下的jar文件。
11.各自具體的webapp?/WEB-INF/classes下的class文件。
12.各自具體的webapp?/WEB-INF/lib下的jar文件。
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?
--------------
因此放在不同webapp里的class文件,會被classloader加載成不同的實例。
例如假設下面兩個不同內容的class。分別放在不同的webapp的class目錄下。
package?com.lizongbo;
public?class?TestClass?{
??private?String?NAME="lizongbo";
}
package?com.lizongbo;
public?class?TestClass?{
??private?String?NAME="li_zongbo";
}
在不同的webapp得到的com.lizongbo.NAME結果是不同的,且互不影響。
但是注意,以下包名開頭的class例外:
javax.*?
org.xml.sax.*?
org.w3c.dom.*?
org.apache.xerces.*?
org.apache.xalan.*?
ps,注意.在各個jar中的META-INFMAINFEST.MF文件里Class-Path鍵值對,也會提供jar的加載優先順序。
例如某jar的MAINFEST.MF內容如下:
Manifest-Version:?1.0
Created-By:?lizongbo
Class-Path:?commons-beanutils.jar
Class-Path:?commons-collections.jar
Class-Path:?commons-dbcp.jar
Class-Path:?commons-digester.jar
Class-Path:?commons-logging.jar
Class-Path:?commons-pool.jar
Class-Path:?commons-services.jar
Class-Path:?commons-validator.jar
Class-Path:?jakarta-oro.jar
Main-Class:?com.lizongbo.MyTestClass
1.最先是$JAVA_HOME/jre/lib/ext/下的jar文件。
2.環境變量CLASSPATH中的jar和class文件。
3.$CATALINA_HOME/common/classes下的class文件。
4.$CATALINA_HOME/commons/endorsed下的jar文件。
5.$CATALINA_HOME/commons/i18n下的jar文件。
6.$CATALINA_HOME/common/lib?下的jar文件。
(JDBC驅動之類的jar文件可以放在這里,這樣就可以避免在server.xml配置好數據源卻出現找不到JDBC?Driver的情況。)
7.$CATALINA_HOME/server/classes下的class文件。
8.$CATALINA_HOME/server/lib/下的jar文件。
9.$CATALINA_BASE/shared/classes?下的class文件。
10.$CATALINA_BASE/shared/lib下的jar文件。
11.各自具體的webapp?/WEB-INF/classes下的class文件。
12.各自具體的webapp?/WEB-INF/lib下的jar文件。
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?
--------------
因此放在不同webapp里的class文件,會被classloader加載成不同的實例。
例如假設下面兩個不同內容的class。分別放在不同的webapp的class目錄下。
package?com.lizongbo;
public?class?TestClass?{
??private?String?NAME="lizongbo";
}
package?com.lizongbo;
public?class?TestClass?{
??private?String?NAME="li_zongbo";
}
在不同的webapp得到的com.lizongbo.NAME結果是不同的,且互不影響。
但是注意,以下包名開頭的class例外:
javax.*?
org.xml.sax.*?
org.w3c.dom.*?
org.apache.xerces.*?
org.apache.xalan.*?
ps,注意.在各個jar中的META-INFMAINFEST.MF文件里Class-Path鍵值對,也會提供jar的加載優先順序。
例如某jar的MAINFEST.MF內容如下:
Manifest-Version:?1.0
Created-By:?lizongbo
Class-Path:?commons-beanutils.jar
Class-Path:?commons-collections.jar
Class-Path:?commons-dbcp.jar
Class-Path:?commons-digester.jar
Class-Path:?commons-logging.jar
Class-Path:?commons-pool.jar
Class-Path:?commons-services.jar
Class-Path:?commons-validator.jar
Class-Path:?jakarta-oro.jar
Main-Class:?com.lizongbo.MyTestClass
更多文章、技術交流、商務合作、聯系博主
微信掃碼或搜索:z360901061

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