简述Tomcat 中类加载的顺序 ?

在Tomcat中,类加载遵循Java的委托模型,但增加了一些特定的扩展来支持Web应用的隔离、热部署和其他特性。Tomcat使用了一系列的类加载器,它们有特定的加载顺序和职责:

1. Bootstrap ClassLoader

  • 职责:加载Java的核心库(位于<JAVA_HOME>/jre/lib目录下的类)。
  • 特点:这是最顶层的类加载器,由C++编写,是JVM的一部分。

2. System ClassLoader

  • 职责:加载环境变量CLASSPATH或系统属性java.class.path指定的类库。
  • 特点:这个加载器加载的是系统级的类,对所有的Web应用都是可见的。

3. Common ClassLoader

  • 职责:加载<CATALINA_HOME>/lib目录下的类库,这些类库对所有的Web应用都是可见的,但不会被Web应用的类加载器重新加载。
  • 特点:用于加载Tomcat和其他共享库。

4. Catalina ClassLoader

  • 职责:加载Tomcat服务器自身的类,位于<CATALINA_HOME>/server/lib,Tomcat 6开始已经不再使用这个目录,统一放到<CATALINA_HOME>/lib
  • 特点:主要是为了兼容旧版本的Tomcat。

5. Webapp ClassLoader

  • 职责:为每个Web应用加载WEB-INF/classes目录下的类和WEB-INF/lib目录下的jar包中的类。
  • 特点:保证了Web应用之间的类隔离,每个Web应用都有自己的Webapp ClassLoader实例。

6. JSP ClassLoader

  • 职责:编译和加载JSP文件生成的Servlet类。
  • 特点:只有在需要时才会创建,用于加载特定的JSP页面。

类加载顺序

当加载一个类时,Tomcat按照以下顺序尝试使用这些类加载器:

  1. 检查当前Web应用的Webapp ClassLoader:如果找到,就使用这个类加载器加载类。
  2. Common ClassLoader:如果Webapp ClassLoader找不到指定的类,就会委托给Common ClassLoader。
  3. System ClassLoader:接着委托给System ClassLoader。
  4. Bootstrap ClassLoader:最后委托给Bootstrap ClassLoader。

这个顺序确保了Web应用可以使用自己的类库,同时还能访问共享的类库和Java的核心库。注意,这个过程中,每个加载器首先会尝试自己加载类,如果自己加载不了,才会委托给父加载器。这种机制支持了Tomcat中的Web应用隔离和热部署特性。

发表评论

后才能评论