简述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按照以下顺序尝试使用这些类加载器:
- 检查当前Web应用的Webapp ClassLoader:如果找到,就使用这个类加载器加载类。
- Common ClassLoader:如果Webapp ClassLoader找不到指定的类,就会委托给Common ClassLoader。
- System ClassLoader:接着委托给System ClassLoader。
- Bootstrap ClassLoader:最后委托给Bootstrap ClassLoader。
这个顺序确保了Web应用可以使用自己的类库,同时还能访问共享的类库和Java的核心库。注意,这个过程中,每个加载器首先会尝试自己加载类,如果自己加载不了,才会委托给父加载器。这种机制支持了Tomcat中的Web应用隔离和热部署特性。