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