同其余服务器应用同样,tomcat安装了各类classloader(classes that implement java.lang.ClassLoader
)html
Bootstrap | System | Common / \ Catalina Shared / \ Webapp1 Webapp2 ... / / Jasper1 Jasper2
$JAVA_HOME/jre/lib/ext
). Note: some JVMs may implement this as more than one class loader, or it may not be visible (as a class loader) at all. CLASSPATH 指定的Jars
. 全部加载的类对Tomcat内部classes和web applications可见。可是tomcat脚本($CATALINA_HOME/bin/catalina.sh
或 %CATALINA_HOME%\bin\catalina.bat
)会彻底忽略掉CLASSPATH,只加载%CATALINA_HOME%/bin目录下的bootstrap.jar、tomcat-juli.jar、commons-daemon.jar。除非经过$CATALINA_HOME/bin/setenv.sh指定。/WEB-INF/classes
directory of your web application, plus classes and resources in JAR files under the /WEB-INF/lib
directory of your web application, are made visible to this web application, but not to other ones.Therefore, from the perspective of a web application, class or resource loading looks in the following repositories, in this order:java
If the web application class loader is configured with <Loader delegate="true"/>
then the order becomes:web
首先,你须要了解一下JVM的Classloader机制(详细请自行google之)。
简而言之,JVM的classloader加载继承关系分为BootstarpClassLoader --> ExtClassLoader --> SystemClassLoader,应用的WebAppClassLoader继承自SystemClassLoader,在加载具体某个类时,通常会先委托给父类ClassLoader,当父类ClassLoader没法加载成功时,才会再由子类ClassLoader尝试加载,这就是所谓的delegate机制。apache
其次,Tomcat在jvm的ClassLoader机制上增长了几个继承层次。
SystemClassLoader --> CommonClassLoader -->(ServerClassLoader | SharedClassLoader --> WebAppClassLoader)。
CommonClassLoader用来加载${CATALINA_HOME}/conf/catalina.properties中common.loader配置目录下的类文件,通常是用来加载${CATALINA_HOME}/lib下的文件。该loader加载的类为tomcat服务器和tomcat下面的全部webApp所共享。
ServerClassLoader用来加载${CATALINA_HOME}/conf/catalina.properties中server.loader配置目录下的类文件,通常是用来加载${CATALINA_HOME}/server下的文件。该loader加载的类为tomcat服务器所独有核心类,tomcat下面的WebApp没法访问。
SharedClassLoader用来加载${CATALINA_HOME}/conf/catalina.properties中shared.loader配置目录下的类文件,通常是用来加载${CATALINA_HOME}/shared下的文件。该loader加载的类为tomcat下面的全部webApp所共享。
WebAppClassLoader用来加载${CATALINA_HOME}/webapps/目录下每一个WebApp应用的/WEB-INF/class,/WEB-INF/lib的类文件,每一个WebApp对应一个WebAppClassLoader,用来加载其所须要的类文件。bootstrap
最后,说一下delegate配置的意义。
True,表示tomcat将遵循JVM的delegate机制,即一个WebAppClassLoader在加载类文件时,会先递交给SharedClassLoader加载,SharedClassLoader没法加载成功,会继续向本身的父类委托,一直到BootstarpClassLoader,若是都没有加载成功,则最后由WebAppClassLoader本身进行加载。
False,表示将不遵循这个delegate机制,即WebAppClassLoader在加载类文件时,会优先本身尝试加载,若是加载失败,才会沿着继承链,依次委托父类加载。segmentfault
在此说一下配置为False须要注意的问题:一旦配置为False,若是你在WebApp中本身定义了一个java.lang.String,则这个String类会有可能覆盖掉jdk中的String类,这也许不是你想要的结果。另外对于多个WebApp公用jar包,你可能会放到${CATALINA_HOME}/shared目录中共享,可是一不当心在应用的/WEB-INF/lib中也包含了一个同名的但版本不一致的jar的话,这就有可能会致使不少奇怪的问题。tomcat