Tomcat5 和 Tomcat6 类加载器架构

曾经终败给现在 2022-06-02 05:25 274阅读 0赞

Tomcat5 和 Tomcat6 类加载器架构

1. Tomcat 5 ClassLoader 架构:

  1. Bootstrap
  2. |
  3. System
  4. |
  5. Common
  6. / \\

Catalina Shared
/ \
Webapp1 Webapp2

在Tomcat5/server/lib/catalina.jar中,查看org/apache/catalina/startup/catalina.properties文件,从中可以看到上图中的3个classloader的加载项定义:

common.loader=${catalina.home}/common/classes,${catalina.home}/common/i18n/*.jar,${catalina.home}/common/endorsed/*.jar,${catalina.home}/common/lib/*.jar

server.loader=${catalina.home}/server/classes,${catalina.home}/server/lib/*.jar

shared.loader=${catalina.base}/shared/classes,${catalina.base}/shared/lib/*.jar

同时,tomcat的安装目录下也存在上述server和shared文件夹,用于存放相关的jar。

在web app中的class加载时的搜索顺序如下:

Bootstrap—->System—->/WEB-INF/classes—-> /WEB-INF/lib/\.jar—->* Common——>Shared

2. Tomcat 6 ClassLoader 架构:

  1. Bootstrap
  2. |
  3. System
  4. |
  5. Common
  6. / \\

Webapp1 Webapp2 …

Tomcat 6 中所有的 jar 都存放在%TOMCAT_HOME%/lib目录下。这点从catalina.jar中,查看org/apache/catalina/startup /catalina.properties文件中也可以看出,在Tomcat 6的catalina.properties文件中,“server.loader”和“shared.loader”已经为空了。具体代码如下:

common.loader=${catalina.home}/lib,${catalina.home}/lib/*.jar

server.loader=

shared.loader=

同时在实际初始化类加载器时,源码(org.apache.catalina.startup.Bootstrap.createClassLoader)中有如下代码:

//此行取出catalina.properties中定义的“server.loader”和“shared.loader”的值

String value = CatalinaProperties.getProperty(name + “.loader”);

//如果值为空,则返回parent,此时,parent即commonLoader,加载项对应common.loader的值

if ((value == null)|| (value.equals(“”)))

  1. return parent;

由此可见,在Tomcat 6 中,原来的”server”和”shared”2个类加载器没有任何作用,都划拨到common 类加载器去处理了。从Tomcat 6 的安装目录中也可以看到,没有了server”和”shared”2个文件夹。

web app中的class加载时的搜索顺序改变成如下:

Bootstrap—->System—->/WEB-INF/classes—-> /WEB-INF/lib/\.jar—->* Common

同时,在源码中还有另2行相关的类加载器初始化代码需要关注:

Thread.currentThread().setContextClassLoader(catalinaLoader);

SecurityClassLoad.securityClassLoad(catalinaLoader);

ContextClassLoader为线程上下文加载器,正常的双亲委派模型中,下层的类加载器可以使用上层父加载器加载的对象,但是上层父类的加载器不可以使用子类加载的对象。而有些时候程序的确需要上层调用下层,这时候就需要线程上下文加载器来处理。

SecurityClassLoad源码很清楚的指出,当启动了SecurityManager时,为避免触发AccessControlException,预先加载一些类。在 catalina.bat中存在如下定义:SECURITY_POLICY_FILE=%CATALINA_BASE%/conf/catalina.policy

发表评论

表情:
评论列表 (有 0 条评论,274人围观)

还没有评论,来说两句吧...

相关阅读

    相关 说说tomcat

       看到这个标题可能很多同学感觉这东西好像离自己的开发工作很遥远,但其实并没有想象的那么遥远。想一想为啥我们JSP修改之后不需要重启?它的热更新是怎么实现的?如果我们一个to