Tomcat ClassLoader

Tomcat中的类加载机制和JDK中的委托模型略有不同(缺少了JDK的ExtClassLoader)。Tomcat Server在启动的时候将构造一个ClassLoader树,以保证模块的类库是私有(在Java类加载器体系结构中定义到:被引用类默认由依赖类的ClassLoader加载,而这样设计的原因是,运行时相同层次的ClassLoader所加载的类无法看到其他ClassLoader所加载的类--安全机制),ClassLoader架构图如下:


            

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


1)Bootstrap ClassLoader: 加载由JVM提供的基本运行时类和系统扩展目录($JAVA_HOME/jre/lib/ext)下的JAR包;



2)System ClassLoader: 通常这个加载器用来加载CLASSPATH环境变量中指定的类,
 该类装载器对于Tomcat内部的程序和应用层的程序都是可见的,但在Tomcat7的启动脚本($CATALINA_HOME/bin/catalina.sh)中改变了它的行为,它只加载下面的jar:
      $CATALINA_HOME/bin/bootstrap.jar    //包含一个main()方法来初始化tomcat7服务,并实例类装器所依赖的类文件。

$CATALINA_HOME/bin/tomcat-juli.jar // 初始化日志配置文件"%CATALINA_BASE%\conf\logging.properties"和日志管                      理"org.apache.juli.ClassLoaderLogManager"

$CATALINA_HOME/bin/commons-daemon.jar // 这个来自 Apache Commons Daemon 项目. 这个jar没有写在catalina.bat|.sh 脚本里执行(一开始我自己找的时候也漏了, 嘿嘿) , 但在bootstrap.jar里面引用了.

3)Common ClassLoader:加载Tomcat本身和所有的web应用都可见的类。通常,应用的类不应该由他加载。$CATALINA_HOME/lib下的jar都由这个加载器加载。包括: 
 

  版本不一样包可能会有出入, 我的是Tomcat7.0.42共19个包。

           annotations-api.jar  // JEE annotations classes.
        catalina.jar // Implementation of the Catalina servlet container portion of Tomcat7.
        catalina-ant.jar // Tomcat Catalina Ant tasks.
        catalina-ha.jar // High availability package.
        catalina-tribes.jar // Group communication package.
        el-api.jar // EL 2.1 API.
        jasper.jar // Jasper 2 Compiler and Runtime.
        jasper-el.jar // Jasper 2 EL implementation.
        jsp-api.jar // JSP 2.1 API.
        servlet-api.jar // Servlet 2.5 API.
        tomcat-coyote.jar // Tomcat connectors and utility classes.
        tomcat-dbcp.jar // package renamed database connection pool based on Commons DBCP.

        tomcat-i18n-**.jar // Optional JARs containing resource bundles for other languages. As default bundles are also included in each individual JAR, they can be safely removed if no internationalization of messages is needed.

        tomcat-jdbc.jar // An alternative database connection pool implementation, known as Tomcat JDBC pool. See documentation for more details.
        tomcat-util.jar   // Common classes used by various components of Apache Tomcat.
        tomcat7-websocket.jar  // WebSocket 1.1 implementation
        websocket-api.jar // WebSocket 1.1 API

                


4)WebappX ClassLoader:对每个Tomcat里的web应用都创建一个加载器,web应用下的WEB-INF/classes,WEB-INF/lib,都由这个加载器加载,由它所加载的类对其他的web应用是不可见的。

web应用的加载器(WebappX)和JDK的委托模型略有不同,这是根据Servlet2.4规范做出的。当WebappX被请求加载一个类时,它首先尝试自己加载,而不是先委托给它的父加载器加载,如果无法加载该类,则委托它的父加载器加载。Tomcat的其他加载器依然遵循通常的委托机制:



综上所术:

以Web应用的角度,要加载类或者资源时,会以下面的顺序加载:
      Bootstrap classes of your JVM (Java虚拟机的Bootstrap)

  /WEB-INF/classes of your web application (Web工程编译后的目录)

  /WEB-INF/lib/*.jar of your web application (Web工程依赖的jar包)
      System class loader classses (参照上文) 
      Common class loader classes (参照上文)

如果我的Web应用类加载器配置了"delegate=true", 则加载顺序如下:

    Bootstrap classes of your JVM (Java虚拟机的Bootstrap)

    System class loader classses (参照上文) 
        Common class loader classes (参照上文)

 /WEB-INF/classes of your web application (Web工程编译后的目录)

 /WEB-INF/lib/*.jar of your web application (Web工程依赖的jar包)


以上翻译来自 Tomcat官网

结合笔者的这篇Tomcat在Linux上部署实践, 相信你会对服务器部署的内部流程理解更清晰。


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值