一、概述
主流的java web服务器,如Tomcat、Jetty、webLogic等服务器,都实现了自己定义的类加载器(一般不止一个)。因为一个功能健全的web服务器,就都要解决以下几个问题
(1)部署在同一台服务器上的2个web应用程序所使用的java类库可以实现相互隔离,这个是最基本的需求。
(2)部署在同一台服务器上的2个web应用程序所使用的java类库可以相互共享,这个需求很常见,如有10个使用Spring组织的应用程序部署在同一台服务器上,如果有10分spring分别放在各个应用程序中,将会是很大的资源浪费。 另外的问题是,一个tomcat只启动一个JVM,如果10个同样的spring库类要加载10次,虚拟机JVM的方法区(类区)将会出现过度膨胀的风险
(3)服务器需要尽可能地保证自身的安全不受部署Web应用的影响。因此服务器本身也有类库依赖的问题,基于安全考虑,服务器所使用的类库是需要与应用程序的类库独立开来的
二、基于上述几个问题,Tomcat是怎么处理的
(1)每个应用程序都有自己的ClassPath路径,一般是以”lib”或”classed”命名。这样每个应用程序也会有自己这个程序对应的类加载器,这样会保证每个应用程序加载的类都是与其他应用程序是隔离的,WebApp ClassLoader A ,WebApp ClassLoader B。
(2)那么如果需要同时公用的类库,就放置在Tomcat/lib目录下,Common ClassLoader会进行加载,那个不管是哪个WebAPP都可以共享这个类库了
(3)
1. 放置在/common目录中;类库可被Tomcat和所有的web应用程序共同使用。
2. 放置在/server目录中:类库可被Tomcat使用,对所有的Web应用程序都不可见
3. 放置在/shared目录中:类库可被所有web应用程序共同使用,但对Tomcat自己不可见。
4. 放置在/WebApp/WEB-INF目录中:类库仅仅可以被此web应用程序使用,对Tomcat和其他web应用程序都不可见。