Tomcat 5.5.23 文档阅读Tips 9 - Class Loading

本文讲述了Tomcat的classloading的逻辑。 

1. 之所以要讲Classloading的事情,关键还是解决在开发过程中碰到的class找不到,一些资源文件找不到的问题。要解决这样的问题,就必须理解Tomcat的classloader会到什么地方去找class,找资源。 

2. 首先是一个总结,告诉我们应该怎样防止自己的class和资源: 

(1) For classes and resources specific to a particular web application, place unpacked classes and resources under /WEB-INF/classes of your web application archive, or place JAR files containing those classes and resources under /WEB-INF/lib of your web application archive. 
(2) For classes and resources that must be shared across all web applications, place unpacked classes and resources under $CATALINA_BASE/shared/classes, or place JAR files containing those classes and resources under $CATALINA_BASE/shared/lib. 

大体的意思就是,如果资源和class文件只是for一个web app的,那么请把class文件,资源文件放到/WEB-INF/classes目录下,如果已经将class或资源文件打成了jar包,或是一些第三方的jar包,请放到/WEB-INF/lib目录下;如果这些class和资源文件要共享给其他的web app,请把他们放到$CATALINA_BASE/shared/classes, $CATALINA_BASE/shared/lib目录下。这里,$CATALINA_BASE一般就是$CATALINA_HOME,只不过的当我们启动了多个Tomcat的时候,需要用到$CATALINA_BASE,因为多个Tomcat他们的$CATALINA_HOME不一定一样。 

3. 然后文章就详细描述了Tomcat的一些classloader,和他们的逻辑,从而也就解释了上面的总结,可以看到最后的webappx这种classesloader就会负责load某个webapp中的资源,而有一个叫做Shared的classloader就会load放在$CATALINA_BASE/shared目录下的资源。这就是为什么我们把东西放在这些地方就能被发现和load的原因。具体可以看本文档,讲的很详细,包括Tomcat下面common目录下的东西是由哪个classloader load的(就是一个名为Common的classloader),等等。比如那个名为Catalina的classloader就负责load tomcat自己的classes,所以这个classloader对于webapp来说是不可见的。这里就是Tomcat中的classloader的关系图: 

 

Bootstrap
             |
       System
             |
       Common
         /      \
Catalina    Shared
                  /    \
        Webapp1  Webapp2 ...

 

 4. 最后文档给出了一个非常有用的东西,也就是对于一个web app来说,tomcat是按照如下顺序来寻找class和资源的: 


    Bootstrap classes of your JVM 
    System class loader classses (described above) 
    /WEB-INF/classes of your web application 
    /WEB-INF/lib/*.jar of your web application 
    $CATALINA_HOME/common/classes 
    $CATALINA_HOME/common/endorsed/*.jar 
    $CATALINA_HOME/common/i18n/*.jar 
    $CATALINA_HOME/common/lib/*.jar 
    $CATALINA_BASE/shared/classes 
    $CATALINA_BASE/shared/lib/*.jar
posted @ 2011-01-11 22:30  super119  阅读(259)  评论(0编辑  收藏  举报