1.在tomcat/common/lib下的jar文件,若更新或新增了,則只能重啓服務器,才能從新加載jar包,使jar包生效。java
2.若是application的WEB-INF/lib下的jar文件更新,則能夠不重啓tomcat便能使之生效,作法是修改application的Context,
修改其reloadable屬性爲true,(若是沒有該屬性就添加),該屬性默認是false。 web
例如:
<Context path="/myweb" docBase="D:\workplace\myweb\WebRoot"
debug="5" reloadable="true" crossContext="true"/>
當咱們啓動一個tomcat的服務的時候,jar包和claess文件是是以怎麼樣的順序被加載進來的?
加載順序:
1. $java_home/lib 目錄下的Java核心api
2. $java_home/lib/ext 目錄下的java擴展jar包
3. java -classpath/-Djava.class.path所指的目錄下的類與jar包
4. $CATALINA_HOME/common目錄下按照文件夾的順序從上往下依次加載
5. $CATALINA_HOME/server目錄下按照文件夾的順序從上往下依次加載
6. $CATALINA_BASE/shared目錄下按照文件夾的順序從上往下依次加載
7. 咱們的項目路徑/WEB-INF/classes下的class文件
8. 咱們的項目路徑/WEB-INF/lib下的jar文件apache
在同一個文件夾下,jar包是按順序從上到下依次加載
由ClassLoader的雙親委託模式加載機制咱們能夠知道,假設兩個包名和類名徹底相同
的class文件再也不同一個jar包,若是一個class文件已經被加載java虛擬機裏了,
那麼後面的相同的class文件就不會被加載了。api
一、在tomcat根目錄下新建shared/lib目錄結構,將項目的jar包放在此目錄下,
記得將項目下的jar包(通常在項目的WEB-INF\lib目錄下)刪除。
二、修改tomcat的conf目錄下的catalina.properties文件,主要修改兩處
1)shared.loader的值改成本身創建的共享jar包目錄中全部的jar包,本例爲:
shared.loader=D:/Program Files/Tomcat7/shared/lib/*.jar
2)tomcat.util.scan.DefaultJarScanner.jarsToSkip的值所有註釋掉,追加*.jar。本例爲:
tomcat.util.scan.DefaultJarScanner.jarsToSkip=\*.jar
效果:修改後tomcat的啓動速度加快。同時防止tomcat屢次加載項目中重複的jar包,形成內存移除異常。
注:實際部署的時候發現,不須要修改「tomcat.util.scan.DefaultJarScanner.jarsToSkip」的值,
修改後反而可能出錯,具體緣由未知。使用的時候具體狀況具體分析tomcat
---------------------------------------------------------------------------------------------------------服務器
tomcat的加載運行機制與JAVA虛擬機的父類委託機制稍有不一樣。
下面來作詳細敘述:
一、首先加載Tomcat_HOME/lib目錄下的jar包
二、而後加載Tomcat_HOME/webapps/項目名/WEB-INF/lib的jar包
三、最後加載的是Tomcat_HOME/webapps/項目名/WEB-INF/classes下的類文件
注:本機的Tomcat_HOME爲D:\Users\Administrator\Tomcat\apache-tomcat-7.0.54;app
值得注意的關鍵是:tomcat按上述順序依次加載資源,當後加載的資源與以前加載的資源相重時,後加載的資源會繼續加載並將以前的資源覆蓋。webapp