1. Web服務(wù)器的需求:
1)兩個web服務(wù)相互隔離(java類庫隔離)
2)兩個web服務(wù)有些類庫要共享唇撬,但是不能放多份相同的類庫,會造成方法區(qū)堆積吩跋。
3)web服務(wù)器要不受web服務(wù)影響
2)JSP應(yīng)用需要HotSwap功能
? ? 所以單獨一個classpath無法滿足web服務(wù)器需求寞射,所以web服務(wù)器提供了好幾個classpath路徑供用戶存放第三方類庫。不同路徑的的類庫具有不同訪問范圍和服務(wù)對象锌钮。---通常桥温,每個目錄會有一個自定義類加載器去加載放置里面的Java類庫。
2. Tomcat類加載
當(dāng)tomcat啟動時梁丘,會創(chuàng)建幾種類加載器:
1 Bootstrap 引導(dǎo)類加載器 + Extension類加載器
? ? 先嘗試在Bootstrap(位于jre/lib/rt.jar下)和Extension(位于jre/lib/ext下)中進行類型加載侵浸。
2 System 系統(tǒng)類加載器(僅僅tomcat使用)
? ? 加載tomcat啟動的類,比如CATALINA_HOME/bin/bootstrap.jar氛谜,通常在catalina.sh中指定掏觉。位于CATALINA_HOME/bin下。
3 Common 通用類加載器(tomcat值漫,web程序都可以使用)
? ? 加載tomcat使用以及應(yīng)用通用的一些類澳腹,位于CATALINA_HOME/lib下,比如servlet-api.jar
4 webapp 應(yīng)用類加載器(僅僅web程序都可以使用)
? ? 每個應(yīng)用在部署后,都會創(chuàng)建一個唯一的類加載器遵湖。該類加載器會加載位于WEB-INF/lib下的jar文件中的class和WEB-INF/classes下的class文件。
Tomcat 類加載順序
? ? 1 使用bootstrap引導(dǎo)類加載器加載(e.g. JRE中的Java基礎(chǔ)包)
? ? 2 使用system系統(tǒng)類加載器加載 (e.g. CATALINA_HOME/bin/bootstrap.jar)
? ? 3 使用應(yīng)用類加載器在WEB-INF/classes中加載
? ? 4 使用應(yīng)用類加載器在WEB-INF/lib中加載?
? ? 5 使用common類加載器在CATALINA_HOME/lib中加載
? ? (e.g. CATALINA_HOME/lib/下的)
? 如果想要在Web應(yīng)用間共享一些Jar包晚吞,則不僅需要將公共包放在Tomcat的lib下延旧,還要刪掉Web應(yīng)用lib中的包,否則Tomcat啟動時還是會優(yōu)先加載Web應(yīng)用lib下的包的槽地。