tomcat为什么要打破双亲委派?

tomcat作为一个服务器需要完成几个功能:

  • 部署在服务器中的应用程序的类库互相隔离开,因为有可能两个应用程序用了同一个类库的不同版本。
  • 相同的类库一个服务器中存在一个。
  • web容器本身也有类库,不能与应用程序的混淆。
  • 需要热加载jsp文件,所以对于jsp需要有自定义类加载器。

jvm默认类加载器无法满足这些要求,因为默认类加载器无法加载同一个类库的不同版本。jsp由于每次修改后都要加载,所以每个jsp应该都有唯一的一个类加载器,所以也不满足默认类加载器要求

tomcat父类加载器想让子类加载器完成类加载改怎么办?

使用线程上下文加载器

tomcat类加载

bootstrap引导类加载器 加载jvm运行基本的类,以及标准扩展类

system 系统类加载器 加载catalina.bat中指定位置的类

common 通用类加载器 位于catalina_home/lib下

webapp 应用类加载器 每个应用部署后,都会创建唯一的一个类加载器

当应用需要加载某个类的时候,会以如下顺序进行类加载

1、使用bootstrap引导类加载器加载

2、使用system系统类加载器加载

3、使用应用类加载器在web-inf/classes中加载

4、使用应用类加载器在web/lib中加载

5、使用common类加载器在catalina_home/lib中加载

Tomcat 类加载
tomcat类加载机制

在 CATALINA_HOME/lib 以及 WEB-INF/lib 中放置了 不同版本的jar包,此时就会导致某些情况下报加载不到类的错误。还有如果多个应用使用同一jar包文件,当放置了多份,就可能导致 多个应用间 出现类加载不到的错误。

相关文章:

  • 2022-01-04
  • 2021-07-05
  • 2021-12-17
  • 2021-06-21
  • 2021-09-13
  • 2021-11-28
猜你喜欢
  • 2021-10-23
  • 2021-04-21
  • 2021-08-03
  • 2021-06-29
相关资源
相似解决方案