學習tomcat類別載入器,首先得先看下JVM提供了幾種類載入器,畢竟tomcat類載入器是依賴JVM類載入器的。
JVM類載入器:引導類別載入器(bootstrapclassloader)、擴充類別載入器(extension classloader)、系統類別載入器(又稱為應用類別載入器,system classloader)。引導類別載入器是擴充類別載入器的父載入器,而擴充類別載入器又是系統類別載入器的父載入器。
(1) Bootstrap Classloader 是JVM 利用JNI的方式採用C語言實作的(即它並不是Java.lang.ClassLoader的子類別)。負責載入%JAVA_HOME%\lib下的類別庫或是由-Xbootclasspath選項或使用-D選項指定sun.boot.class.path系統屬性指定的類別。
(2) Extension ClassLoader 由sun.misc.Launcher$ExtClassLoader實現,負責載入%JAVA_HOME%\jre\lib\ext中的類別庫或是由系統變數java.ext.dirs指定的類別庫。
(3) System ClassLoader 由sum.misc.Launcher$AppClassLoader實現,負責載入java應用程式涉及到的類別。載入器可以透過ClassLoader.getSystemClassLoader()來取得
#tomcat啟動時,會建立幾個類別載入器:
# 1 Bootstrap 引導類別載入器
載入JVM啟動所需的類,以及標準擴充類,位於jre/lib/ext下。
2 System 系統類別載入器
載入tomcat啟動的類,例如bootstrap.jar,通常在catalina.bat或catalina.sh中指定。位於CATALINA_HOME/bin下。
3 Common 通用類別載入器
載入tomcat使用以及應用通用的一些類,位於CATALINA_HOME/lib下,例如servlet-api.jar
4 webapp 應用程式類別載入器
每個應用程式在部署後,都會建立一個唯一的類別載入器。此類別載入器會載入位於 WEB-INF/lib下的jar檔案中的class 和 WEB-INF/classes下的class檔案。
當應用程式需要到某個類別時,則會依照下面的順序進行類別載入:
1 使用bootstrap引導類別載入
2 使用system系統類別載入器載入
3 使用應用程式類別載入器在WEB-INF/classes中載入
4 使用應用程式類別載入器在WEB-INF/lib中載入
5 使用common類別載入器在CATALINA_HOME/lib中載入
還有一點要講下的是java檔案放在Eclipse中的src資料夾下會優先jar套件中的class:
這是因為Eclipse中的src資料夾中的檔案java以及webContent中的JSP都會在tomcat啟動時,被編譯成class檔案放在 WEB-INF/class 中。而Eclipse外部引用的jar包,則相當於放在 WEB-INF/lib 中。因此肯定是 java檔或JSP檔編譯出的class優先載入。
另外還需要注意在 CATALINA_HOME/lib 以及 WEB-INF/lib 中放置了不同版本的jar包,此時就會導致某些情況下報載入不到類別的錯誤。
還有如果多個應用程式使用相同jar套件文件,當放置了多份,就可能導致 多個應用程式間 出現類別載入不到的錯誤。
以上是Tomcat中的幾種類別載入器介紹的詳細內容。更多資訊請關注PHP中文網其他相關文章!