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
https://blog.csdn.net/tangyangbuaa/article/details/3672450
/**
* 该类的main方法的主要任务: --------------------------
*
* 1,创建TOMCAT自己的类载入器(ClassLoader) +---------------------------+ | Bootstrap | | | | |
* System | | | | | Common | | / / | | Catalina Shared |
* +---------------------------+ 其中: - Bootstrap -
* 载入JVM自带的类和$JAVA_HOME/jre/lib/ext/*.jar - System - 载入$CLASSPATH/*.class -
* 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的代理(待核实)
* 这样可以让不同的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/
这便是
/** * 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 - * 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的代理 * 这样可以让不同的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? * */ 标签:WEB,tomcat,ClassLoader,class,载入,HOME,APP,加载 From: https://www.cnblogs.com/silyvin/p/18082705