tomcat类加载机制

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包文件,当放置了多份,就可能导致 多个应用间 出现类加载不到的错误。

你可能感兴趣的:(tomcat,java)