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

posted on 2024-03-19 14:07  silyvin  阅读(169)  评论(0编辑  收藏  举报