Tomcat(20)Tomcat类加载器结构

79 阅读3分钟

Apache Tomcat的类加载器结构是其设计中的一个关键部分,它支持了Web应用程序的隔离和类加载的灵活性。Tomcat的类加载器结构遵循Java的类加载器层次结构,但进行了一些特定的调整以满足Web服务器的需求。以下是Tomcat类加载器结构的详细解释,包括代码示例和结构图。

Tomcat类加载器结构

Tomcat的类加载器结构主要由以下几个类加载器组成:

  1. Bootstrap类加载器:这是Java虚拟机的一部分,负责加载JVM运行时所需的系统类,如java.lang包中的类。

  2. System类加载器:也称为应用程序类加载器,它加载在CLASSPATH环境变量中指定的类。

  3. Common类加载器:这是Tomcat特有的类加载器,位于System类加载器之上。它负责加载Tomcat的共享类和资源,这些类和资源可以被所有Web应用程序访问。

  4. Webapp类加载器:每个Web应用程序都有自己的类加载器实例,称为Webapp类加载器。这个类加载器负责加载特定于该Web应用程序的类和资源。

  5. Jasper类加载器:这是Tomcat特有的类加载器,专门用于加载JSP页面编译后的Servlet类。

类加载器层次结构

Tomcat的类加载器层次结构可以用以下伪代码表示:

Bootstrap
   |
   +- System
   |
   +- Common
   |   |
   |   +- Webapp1
   |   |   |
   |   |   +- Jasper1
   |   |
   |   +- Webapp2
   |       |
   |       +- Jasper2
   |
   +- Webapp3
       |
       +- Jasper3

在这个结构中,每个Web应用程序(如Webapp1、Webapp2等)都有自己的类加载器和Jasper类加载器。

代码示例

在Tomcat中,类加载器的配置可以在conf/catalina.properties文件中找到。以下是一个配置示例,展示了如何设置common.loader属性:

common.loader="${catalina.base}/lib","${catalina.base}/lib/*.jar"

这个配置指定了Common类加载器将加载${catalina.base}/lib目录及其所有.jar文件中的类。

类加载器的工作原理

当一个类需要被加载时,Tomcat会按照以下顺序查找类加载器:

  1. Webapp类加载器:首先尝试从Web应用程序的WEB-INF/classesWEB-INF/lib目录加载类。
  2. Common类加载器:如果Webapp类加载器没有找到类,则尝试从Common类加载器的路径加载类。
  3. System类加载器:如果Common类加载器也没有找到类,则尝试从System类加载器的路径加载类。
  4. Bootstrap类加载器:如果以上类加载器都没有找到类,则尝试从Bootstrap类加载器的路径加载类。

总结

Tomcat的类加载器结构提供了灵活的类加载机制,允许每个Web应用程序拥有自己的类加载器,从而实现类隔离。这种设计有助于避免类冲突,并支持热部署等功能。通过理解Tomcat的类加载器结构,开发者和系统管理员可以更好地管理和优化Tomcat服务器上的Web应用程序。