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? * */