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