首页 > 编程知识 正文

tomcat自定义类加载器不执行,tomcat 原理

时间:2023-05-05 14:05:04 阅读:32511 作者:871

一、JVM类加载机制介绍

JVM父母委托模型概述:

JVM包含集中式类加载器。

1 bootstrap类加载器引导类加载器

2 ext类加载器扩展类加载器

3 app类加载器APP应用程序类加载器

4自定义类加载器用户定义类加载器

他们的区别上面也有说明。 请注意,不同的类加载器加载的类不同,因此如果用户加载器1有要加载的类,则其他用户不可用。

当JVM运行过程中,用户需要加载某些类时,会按照下面的步骤(父类委托机制)

1用户自己的类加载器将加载请求传递给父加载器,父加载器进一步传递给该父加载器,到达加载器树的顶部。

2顶级类加载器首先加载到该特定位置,如果无法加载,则传递给子类。

3如果尚未加载到最后一层的类加载,则会抛出异常ClassNotFoundException。

因此,按照这个过程可以想到,如果同样在CLASSPATH指定的目录中和自己工作目录中存放相同的class,会优先加载CLASSPATH目录中的文件。

二、TOMCAT类加载机制

tomcat启动时,会创建几种类型的加载程序。

1 Bootstrap 引导类加载器

加载启动JVM所需的类以及jre/lib/ext下的标准扩展类

2 System 系统类加载器

加载tomcat启动类,如bootstrap.jar。 通常在catalina.bat或catalina.sh中指定。 位于CATALINA_HOME/zrdc下。

3 Common 通用类加载器

加载tomcat中使用和常用的类,如CATALINA_HOME/lib下的servlet-API.jar

  4 webapp 应用类加载器

每个APP应用程序在部署后创建唯一的类加载器。 此类加载器加载WEB-INF/lib下的jar文件中的class文件和WEB-INF/classes下的class文件。

当应用需要到某个类时,则会按照下面的顺序进行类加载

使用bootstrap引导类加载器加载

使用系统类加载器加载

3使用APP应用程序类加载器加载到WEB-INF/classes

4使用APP应用程序类加载器加载到WEB-INF/lib

使用common类加载器加载到CATALINA_HOME/lib

三、违反父母委托机制tomcat类加载机制违反父母委托原则,部分未加载非基础类(Object、 String等) ),则优先加载每个web APP应用程序自己的类加载器(WebAppClassLoader ),如果无法加载,则委托公共类加载器的具体加载逻辑是WebAppClassLoader

首先,在本地缓存中检查该类是否已经加载。 一些加载的类缓存在名为resourceEntries的数据结构中。 如果已加载,则返回;否则,进入下一步。 使“系统类加载器”(AppClassLoader )尝试加载该类,主要是因为某些基类被web中的类复盖,加载到中时会返回,而不会继续返回。 如果前两个步骤未加载到目标类中,则web APP应用程序的类加载器将自行加载。 如果已加载,则返回;否则,进入下一步。 如果仍然无法加载,请委托“父类加载器”(Common ClassLoader )加载。 3第四步的顺序已违反父母委托机制,除tomcat外,还有JDBC、JNDI、Thread.currentThread ().setContextClassLoader ); 等等很多地方都同样违反了父母的请求。

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。