​Tomcat的类加载器

来源:互联网 发布:xbox360 知乎 编辑:程序博客网 时间:2024/06/16 11:07

    Tomcat拥有不同的自定义类加载器,以实现对各种资源库的控制。一般来说,Tomcat主要用类加载器解决以下4个问题。


  • 同一个Web服务器里,各个Web项目之间各自使用的Java类库要互相隔离。

  • 同一个Web服务器里,各个Web项目之间可以提供共享的Java类库。

  • 为了使服务器不受Web项目的影响,应该使服务器的类库与应用程序的类库互相   独立。

  • 对于支持JSP的Web服务器,应该支持热插拔(HotSwap)功能。


    对于以上几个问题,如果单独使用一个类加载器明显是达不到效果的,必须根据具体情况使用若干个自定义类加载器。


    下面看看Tomcat的类加载器是怎样定义的。如图所示,启动类加载器、扩展类加载器、应用程序类加载器这三个类加载器属于JDK级别的加载器,它们是唯一的,我们一般不会对其做任何更改。


    接下来,则是Tomcat的类加载器,在Tomcat中,最重要的一个类加载器是Common类加载器,它的父类加载器是应用程序类加载器,负责加载 $CATALINA_ BASE/lib、$CATALINA_HOME/lib两个目录下所有的.class文件与.jar文件。而下面虚线框的两个类加载器主要用在Tomcat 5版本中,Tomcat 5版本中这两个类加载器实例默认与常见类加载器实例不同,Common类加载器是它们的父类加载器。而在Tomcat 7版本中,这两个实例变量也存在,只是catalina.properties配置文件没有对server.loader和share.loader两项进行配置,所以在程序里这两个类加载器实例就被赋值为Common类加载器实例,即一个Tomcat 7版本的实例其实就只有Common类加载器实例。



 

    下面再看看Tomcat 7版本中对这些类加载器处理的代码。


private void initClassLoaders() {
        try {
            commonLoader = createClassLoader("common", null);
             if( commonLoader == null ) {
                 commonLoader=this.getClass().getClassLoader();
            }
            catalinaLoader = createClassLoader("server", commonLoader);
            sharedLoader = createClassLoader("shared", commonLoader);
       } catch (Throwable t) {
            handleThrowable(t);
            log.error("Class loader creation threw exception", t);
           System.exit(1);
       }
}

 

    首先创建一个Common类加载器,再把Common类加载器作为参数传进createClassLoader方法里,在这个方法里面会根据catalina.properties中的server.loader和share.loader属性是否为空判断是否另外创建新的类加载器。如果属性为空,则把常见类加载器直接赋值给Catalina类加载器和共享类加载器。如果默认配置满足不了你的需求,可以通过修改catalina.properties配置文件满足需要。


    从图中的WebApp ClassLoader来看,就大概知道它主要用于加载Web应用程序。它的父类加载器是Common类加载器,Tomcat中一般会有多个WebApp类加载器实例,每个类加载器负责加载一个Web程序。


    对照这样的一个类加载器结构,看看上面需要解决的问题是否解决。由于每个Web应用项目都有自己的WebApp类加载器,很好地使多个Web应用程序之间互相隔离且能通过创建新的WebApp类加载器达到热部署。这种类加载器结构能有效使Tomcat不受Web应用程序影响,而Common类加载器的存在使多个Web应用程序能够互相共享类库。



========广告时间========

公众号的菜单已分为“分布式”、“机器学习”、“深度学习”、“NLP”、“Java深度”、“Java并发核心”、“JDK源码”、“Tomcat内核”等,可能有一款适合你的胃口。

鄙人的新书《Tomcat内核设计剖析》已经在京东销售了,有需要的朋友可以到 https://item.jd.com/12185360.html 购买。感谢各位朋友。

为什么写《Tomcat内核设计剖析》

=========================


原创粉丝点击