最好先了解Java的雙親委派機制再看這篇文章。
Bootstrap | System | Common / \ Webapp1 Webapp2 ...
$JAVA_HOME/jre/lib/ext
)中的JAR文件的全部類。注意:有些JVM可能將其實現爲多個類加載器,好比HotSpot就分爲啓動類加載器(Bootstrap ClassLoader)和擴展類加載器(Extension ClassLoader)。System 這個類加載器一般是經過CLASSPATH環境變量的內容初始化的。 全部這些類對於Tomcat和Web應用程序都是可見的。可是,標準Tomcat啓動腳本($CATALINA_HOME/bin/catalina.sh
或%CATALINA_HOME%\bin\catalina.bat
)徹底忽略了CLASSPATH環境變量自己的內容,而是從如下存儲庫(repositories)構建System類加載器:html
$CATALINA_HOME/bin/bootstrap.jar:包含用於初始化Tomcat服務器的
main()`方法以及它所依賴的類加載器實現類。$CATALINA_BASE/bin/tomcat-juli.jar
或者$CATALINA_HOME/bin/tomcat-juli.jar
:日誌實現類。其中包括稱爲Tomcat JULI
的java.util.loggingAPI
的加強類以及由Tomcat內部使用的ApacheCommons Logging
庫的軟件包重命名副本。Common
這個類加載器包含了對Tomcat內部類和全部Web應用程序均可見的其餘類。一般,應用程序類別不該放置在此處。這個類加載器搜索的位置由$CATALINA_BASE/conf/catalina.properties
中的common.loader屬性定義。默認設置將按照它們列出的順序搜索如下位置:java
$CATALINA_BASE/lib
下沒打包的classes和資源文件$CATALINA_BASE/lib
下的jar$CATALINA_HOME/lib
下沒打包的classes和資源文件$CATALINA_HOME/lib
下的jar/WEB-INF/classes
目錄中的全部未打包的類和資源,以及Web應用程序的/WEB-INF/lib
目錄下的JAR文件中的類和資源均可以被此Web應用程序訪問,但不能訪問到其餘的。如上所述,Web應用程序類加載器與默認的Java委託模型不一樣(即雙親委派)。當處理從Web應用程序的WebappX類加載器加載類的請求時,該類加載器將首先在本地存儲庫中查找,而不是在查找以前進行委託。 可是有例外,做爲JRE基類的一部分的類不能被覆蓋。例如J2SE 1.4+中的XML解析器組件,以及Java 8將會使用的類。最後,包含Servlet API類的任何JAR文件將被類加載器顯式忽略 - 你的Web應用程序中不該該包含這些類。 Tomcat中的全部其餘類加載器都遵循一般的代理模式。web
所以,從Web應用程序的角度來看,類或資源加載按如下順序在如下存儲庫中查找:
/WEB-INF/classes
/WEB-INF/lib/*.jar
若是Web應用程序類加載器配置爲<Loader delegate ="true"/>,那麼順序將變爲:
/WEB-INF/classes
/WEB-INF/lib/*.jar
資料apache