tomcat类加载器及优先加载权
https://blog.csdn.net/MeBieber/article/details/105114645?utm_medium=distribute.pc_relevant.none-task-blog-2~default~baidujs_baidulandingword~default-1-105114645-blog-3672450.235^v43^pc_blog_bottom_relevance_base1&spm=1001.2101.3001.4242.2&utm_relevant_index=4
CommonLoader:加载Tomcat所需要的jar包和class文件,可以被Tomcat容器本身以及各个Webapp访问;
CatalinaLoader:Tomcat容器私有的类加载器,加载路径中的class对于Webapp不可见;
SharedLoader:各个Webapp共享的类加载器,加载路径中的class对于所有Webapp可见,对于Tomcat不可见;
WebAppClassLoader:各个Webapp私有的类加载器,加载路径中的class只对当前Webapp可见;
JasperLoader:它出现的目的就是为了被丢弃,加载路径仅仅是某个JSP文件所编译出来的那一个.class文件
https://www.jianshu.com/p/972b45b574b2

/**
* Boostrap loader for Catalina. This application constructs a class loader
* for use in loading the Catalina internal classes (by accumulating all of the
* JAR files found in the "server" directory under "catalina.home"), and
* starts the regular execution of the container. The purpose of this
* roundabout approach is to keep the Catalina internal classes (and any
* other classes they depend on, such as an XML parser) out of the system
* class path and therefore not visible to application level classes.
*
* @author Craig R. McClanahan
* @version $Revision: 1.36 $ $Date: 2002/04/01 19:51:31 $
*/
/**
* 该类的main方法的主要任务: --------------------------
*
* 1,创建TOMCAT自己的类载入器(ClassLoader) +---------------------------+ | Bootstrap | | | | |
* System | | | | | Common | | / / | | Catalina Shared |
* +---------------------------+ 其中: - Bootstrap -
* 载入JVM自带的类和$JAVA_HOME/jre/lib/ext/*.jar - System - 载入$CLASSPATH/*.class - Bootstrap由系统类加载器加载
* Common - 载入$CATALINA_HOME/common/
,它们对TOMCAT和所有的WEB APP都可见 - Catalina -
* 载入$CATALINA_HOME/server/
,它们仅对TOMCAT可见,对所有的WEB APP都不可见 - Shared -
* 载入$CATALINA_HOME/shared/
,它们仅对所有WEB APP可见,对TOMCAT不可见(也不必见)
* 注意:当一个ClassLoader被请求载入一个类时,它首先请求其父ClassLoader完成载入,
* 仅当其父ClassLoader无法载入该类时,才试图自己载入该类 2,改变本身线程的默认ClassLoader(本线程就是Tomcat
* Server线程,类载入器是catalinaLoader)
* 3,让catalinaLoader载入一些类,类的位置在$CATALINA_HOME/server/lib/catalina.jar中
* 4,创建org.apache.catalina.startup.Catalina类的一个实例startupInstance,并为其调用方法:
* startupInstance.setParentClassLoader(sharedLoader);
* startupInstance.process(args);
*
*
* 有关ClassLoader的说明: -----------------------
*
* 每个被DEPLOY的WEB APP都会被创建一个ClassLoader,用来载入该WEB APP自己的类
* 这些类的位置是webappX/WEB-INF/classes/*.class和webappX/WEB-INF/lib/*.jar
*
* ClassLoader的工作流程是: 1) 收到一个载入类的的请求 2) 请求其父ClassLoader来完成该类的载入 3)
* 如果父ClassLoader无法载入,则自己试图完成该类的载入
*
* 特别注意WEB APP自己的ClassLoader的实现与众不同: 它先试图从WEB APP自己的目录里载入,如果失败则请求父ClassLoader的代理 - override loadClass() 打破双亲委派
* 这样可以让不同的WEB APP之间的类载入互不干扰 - 没有因果关系
*
* WEB APP的ClassLoader的层次结构是: +----------------------------+ | Shared | | / /
*
| | Webapp1 Webapp2
| +----------------------------+ 故对于一个WEB
* APP,其类载入的优先顺序如下: - /WEB-INF/classes/*.class 和 /WEB-INF/lib/*.jar - Bootstrap
* classes of JVM - System class loader classes - $CATALINA_HOME/common/
-
* $CATALINA_HOME/shared/
*
*
* 小结: ------
*
* 综上分析 - Tomcat Server线程使用的classLoader是Catalina - 每个WEB
* APP线程使用的classloader是Webapp?
*
*/
浙公网安备 33010602011771号