Tomcat6.0.18学习笔记_Classloader

Tomcat6.0.18与Tomcat5的类加载机制有所不同,在5版本时,如下图:

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

 

在Tomcat5.5/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

初始化这几个类加载器的代码在org.apache.catalina.startup.Bootstrap.initClassLoaders(),代码都很简单,一看即知。

 

Tomcat6.0.18时,类加载机制已经变成如下图:

Bootstrap
          |
       System
          |
       Common
       /     /
  Webapp1   Webapp2 ...

所有的jar文件存放路径也改变了,都存放在apache-tomcat-6.0.18/lib目录下。这点从catalina.properties文件中也可以看出,在Tomcat6.0.18的catalina.properties文件中,“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("")))
            return parent;

由此可见,在Tomcat6.0.18中,5版本中使用的"server"和"shared"2个类加载器默认情况没有任何作用,都变成了common类加载器。从Tomcat6.0.18的安装目录中也可以看到,没有了server"和"shared"2个文件夹。而在web app中的class加载时的搜索顺序改变成如下:

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

 

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

Thread.currentThread().setContextClassLoader(catalinaLoader);

SecurityClassLoad.securityClassLoad(catalinaLoader);

 

Thread.currentThread().setContextClassLoader(catalinaLoader);的原理很简单,当前能获得的类加载器层次过高,无法加载一些额外的class,此时可为线程关联一个指定的类加载器,用于加载一些自己的class。

SecurityClassLoad.securityClassLoad(catalinaLoader);源码很清楚的指出,当启动了SecurityManager时,为避免触发AccessControlException,预先加载一些类。在catalina.bat中存在如下定义:

SECURITY_POLICY_FILE=%CATALINA_BASE%/conf/catalina.policy

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值