Tomcat的类加载机制是使用双亲委派模型来处理JAR冲突的,下面是详细的步骤和小标题:
1、双亲委派模型概述:
Tomcat的类加载器层次结构中,有一个父类加载器(Bootstrap ClassLoader)和多个子类加载器(如Catalina ClassLoader)。
当一个类需要被加载时,首先由父类加载器尝试加载该类,如果父类加载器无法找到该类,则将请求委托给子类加载器。
如果子类加载器也无法找到该类,则继续向上委托给父类加载器,直到找到该类或到达根类加载器为止。
2、处理JAR冲突的步骤:
当存在多个JAR文件包含相同类名的类时,Tomcat会按照以下步骤处理JAR冲突:
1. 查找JAR文件的顺序:
Tomcat会按照在$CATALINA_BASE/lib目录下的配置文件catalina.properties中指定的顺序查找JAR文件。
配置文件中的common.loader属性指定了共享库的路径,而shared.loader属性指定了应用程序的库路径。
Tomcat会先查找共享库路径下的JAR文件,然后查找应用程序库路径下的JAR文件。
2. 确定类的完整名称:
Tomcat会根据类的全限定名(包括包名和类名)来确定要加载的类。
3. 检查已加载的类:
Tomcat会检查已经加载的类是否与要加载的类相同,如果已经加载了相同的类,则不会再次加载。
4. 委托给父类加载器:
如果当前子类加载器无法找到要加载的类,它会将请求委托给父类加载器。
5. 重复步骤3和4:
父类加载器会重复执行步骤3和4,直到找到要加载的类或到达根类加载器为止。
6. 选择最合适的类:
如果多个JAR文件都包含了相同类的字节码,那么最终会选择最先找到的JAR文件中的类作为要加载的类。
7. 返回结果:
一旦找到了要加载的类,Tomcat会将其返回给请求者,并完成类的加载过程。
通过以上步骤,Tomcat能够处理JAR冲突,确保只有一个版本的类被加载到Java虚拟机中。