Tomcat7---類是怎樣被加載的

最好先了解Java的雙親委派機制再看這篇文章。

總體架構

Bootstrap
          |
       System
          |
       Common
       /     \
  Webapp1   Webapp2 ...

類加載器定義

  • Bootstrap 這個類加載器包含Java虛擬機提供的基本運行時類,以及來自System Extensions目錄
    $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

    1. $CATALINA_HOME/bin/bootstrap.jar:包含用於初始化Tomcat服務器的main()`方法以及它所依賴的類加載器實現類。
    2. $CATALINA_BASE/bin/tomcat-juli.jar或者$CATALINA_HOME/bin/tomcat-juli.jar:日誌實現類。其中包括稱爲Tomcat JULIjava.util.loggingAPI的加強類以及由Tomcat內部使用的ApacheCommons Logging庫的軟件包重命名副本。
  • Common
    這個類加載器包含了對Tomcat內部類和全部Web應用程序均可見的其餘類。一般,應用程序類別不該放置在此處。這個類加載器搜索的位置由$CATALINA_BASE/conf/catalina.properties中的common.loader屬性定義。默認設置將按照它們列出的順序搜索如下位置:java

    1. $CATALINA_BASE/lib下沒打包的classes和資源文件
    2. $CATALINA_BASE/lib下的jar
    3. $CATALINA_HOME/lib下沒打包的classes和資源文件
    4. $CATALINA_HOME/lib下的jar
  • WebappX 爲每一個部署在單個Tomcat實例中的Web應用程序建立類加載器。
    Web應用程序的/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應用程序的角度來看,類或資源加載按如下順序在如下存儲庫中查找:
  1. Bootstrap classes of your JVM
  2. web應用的/WEB-INF/classes
  3. web應用的/WEB-INF/lib/*.jar
  4. System class loader classes (如上所述)
  5. Common class loader classes (如上所述)
若是Web應用程序類加載器配置爲<Loader delegate ="true"/>,那麼順序將變爲:
  1. Bootstrap classes of your JVM
  2. System class loader classes (如上所述)
  3. Common class loader classes (如上所述)
  4. web應用的/WEB-INF/classes
  5. web應用的/WEB-INF/lib/*.jar

資料apache

相關文章
相關標籤/搜索