tomcat的class加载的优先顺序
來源:https://bbs.csdn.net/topics/80459833
Tomcat的class加載的優先順序一覽
?
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
(這里可以看出class是先去WEB-INF下面找的)
\${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-INF\MAINFEST.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
那么在加載這個jar的時候,會先在此jar所在目錄下依次先加載commons-beanutils.jar,commons-collections.jar......等jar文件。
在不同的地方放置jar和class可能會產生意想不到的后果,尤其是不同版本的jar文件,因此在實際應用部署web應用時候要特別留心.
例如 使用javamail常見的一個出錯信息:
javax.mail.NoSuchProviderException: No provider for smtp
其真實原因就很可能如下:
在不同的加載jar的目錄下放置了不同版本的mail.jar,比如一個是javamail1.3.1的mail.jar
在D:\jakarta-tomcat-5.5.8\common\lib下,而另外一個是javamail1.3.2的mail.jar在
D:\jakarta-tomcat-5.5.8\webapps\lizongbo\WEB-INF/lib下,
那么lizongbo這個webapp中使用到javamail進行郵件發送的時候,便會出現No provider for smtp的錯誤。
總結
以上是生活随笔為你收集整理的tomcat的class加载的优先顺序的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: python tempfile clea
- 下一篇: python3中数字类型有哪些_pyth