zoukankan      html  css  js  c++  java
  • Tomcat5 和 Tomcat6 类加载器架构

    1. Tomcat 5 ClassLoader 架构:

         Bootstrap 
              | 
         System 
              | 
        Common 
          /         \
    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 架构:

          Bootstrap 
                | 
          System 
                | 
          Common 
           /           \
    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(""))) 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

  • 相关阅读:
    去除 CSDN “官方免费去广告 + 万能工具”
    github 搜索技巧常用
    Python 使用 __doc__ 查看文档
    油猴脚本编写自己的脚本来去除知乎 "我们检测到你可能使用了 AdBlock 或 Adblock Plus"
    Unity 中的 C# Instantiate() 方法解析
    《流畅的 Python 》第 2 章笔记
    html 中 a 标签中 href 的路径相关问题
    VScode 复制代码到博客园编辑器自动带上代码标签问题
    Vue在Ubuntu上的部署
    在ubuntu上编译方式安装nginx
  • 原文地址:https://www.cnblogs.com/orientsun/p/2753278.html
Copyright © 2011-2022 走看看