Tomcat类加载架构
主流的Java web服务器,都实现了自己定义的类加载器,而且一般都还不止一个。因为一个功能健全的web服务器,都要解决如下的问题:
- 1、部署在同一个服务器上的俩个web应用程序所使用的Java类库可以实现相互隔离。
- 2、部署在同一个服务器上的两个web应用程序所使用的Java类库可以互相共享。
- 3、服务器需要尽可能地保证自身的安全不受部署的web应用程序影响。
- 4、支持jsp应用的web服务器,十有八九都需要直接hotswap功能。
在tomcat目录结构中,可以设置3组目录(/common/*,server/*和shared/*,但默认不一定是开放的)用于存放Java类库,另外还应该加上web应用程序自身的“WEB-INF/*”目录,一共4组。
这四组,分别存放:
- 放置在/common目录中。类库可被tomcat和所有的web应用程序共同使用。
- 放置在/sever目录中。类库可被tomcat使用,对所有的web应用程序都不可见。
- 放置在/shared目录中。类库可被所有的web应用程序共同使用,但对tomcat自己不可见。
- 放置在/WebApp/WEB-INF目录中。类库仅仅可以被该web应用程序使用,对tomcat和其他web应用程序不可见。
在上图中,common类加载器、Catalina类加载器(也称为serve类加载器),shared类加载器和WebApp类加载器是tomcat自己定义的类加载。
WebApp类加载器和Jsp类加载器通常还会存在多个实例,每一个web应用程序对应一个webApp类加载器,每一个jsp文件对应一个jsperLoader类加载器。
Common类加载器能加载的类可以被Catalina类加载器和shared类加载器是使用,而Catalina类加载器和shared类加载器自己能加载的类则与对方隔离。WebApp类加载器可以使用Shared类加载器加载到的类,但各个webapp类加载器实例之间是隔离的。jsperLoader的加载范围仅仅是这个Jsp文件所编译出来的一个class文件,它存在的目的就是为了被丢弃。
上图的类加载结构在tomcat6以前是默认的类加载器结构,在tomcat6机以后的简化了默认的目录结构,只有指定了tomcat/conf/catalina.properties配置文件的server.loader和share.loader项后,才会真正建立Catalina类加载器和shared类加载器实例。/common、server、shared3个目录默认合并到一个/lib目录。