Tomcat6 类装载器分析

在研究Tomcat之前,一般是借用现有的UML工具分析Tomcat整体结构,但要分析Tomcat的流程就必须从分析Tomcat的StartUp入手。Tomcat的启动是从解析bat文件开始,bat文件最终调用org.apache.catalina.startup.Bootstrap开始类的加载。

Tomcat6 类装载器的实现都是通过继承于JDK中的 java.lang.ClassLoader类。包括Bootstrap,System,Common和Webapp这四种类加载器来实现不同目录的类文件装载。
    示例结构如下:
      Bootstrap
          |
       System
          |
       Common
       /     /
  Webapp1   Webapp2 ...

 

  Bootstrap & Ext < span>类装载器:

      Bootstrap ClassLoader用于加载最基本的JVM运行环境类,ExtClassLoader装载JDK目录下扩展类($JAVA_HOME/jre/lib/ext)

 

  System 类装载器:
        该类装载器根据JVM的CLASSPATH参数设置装载类文件,该类装载器对于Tomcat内部的程序和应用层的程序都是可见的。
        注:目前tomcat5的启动脚本($CATALINA_HOME/bin/catalina.sh 或 %CATALINA_HOME%/bin/catalina.bat),会把全局环境变量CLASSPATH忽略。
            而且通过下面的两个类库来实现装载设置:
            * $CATALINA_HOME/bin/bootstrap.jar 包含一个main()方法来初始化tomcat6服务,并实例类装器所依赖的类文件。
            * $CATALINA_HOME/bin/tomcat-juli.jar 初始Jakarta commons logging API和 java.util.logging LogManager.
  Common 类装载器:  
        该类装载器对于Tomcat内部的程序和应用层的程序都是可见的.
        当然不太建议把应用层的类库放到这里来加载。
        所有$CATALINA_HOME/lib目录下未压缩的类文件,资源和压缩后Jar/zip文件都会补该类装载器加载。
        
        Tomcat6默认该目录的类文件有:
        * annotations-api.jar - JEE annotations classes.
        * catalina.jar - Implementation of the Catalina servlet container portion of Tomcat6.
        * 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.
        * jasper-jdt.jar - Eclipse JDT 3.2 Java compiler.
        * 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.

    Webapp 类装载器:
      应用层的类装载器,每个应用程序都会创建一个单独的类装载器。该类装载器只能本应用程序中可见。
      所有/WEB-INF/classes目录下未压缩的类文件,资源文件都会补该类装载器加载。
      所有/WEB-INF/lib目录下压缩后Jar/zip文件都会补该类装载器加载。 

 

    把各个类装载器的定义整理出来后,Tomcat6服务器类装载器执行的顺序如下:
    * 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/lib
    * $CATALINA_HOME/lib/*.jar

ClassLoader的工作原理
每个运行中的线程都有一个成员contextClassLoader,用来在运行时动态地载入其它类
系统默认的contextClassLoader是systemClassLoader,所以一般而言java程序在执行时可以使用JVM自带的类、JAVA_HOME/jre/lib/ext/中的类和$CLASSPATH/中的类
可以使用Thread.currentThread().setContextClassLoader(...);更改当前线程的contextClassLoader,来改变其载入类的行为

ClassLoader被组织成树形,一般的工作原理是:
1) 线程需要用到某个类,于是contextClassLoader被请求来载入该类
2) contextClassLoader请求它的父ClassLoader来完成该载入请求
3) 如果父ClassLoader无法载入类,则contextClassLoader试图自己来载入

注意:WebAppClassLoader的工作原理和上述有少许不同:
它先试图自己载入类(在ContextBase/WEB-INF/...中载入类),如果无法载入,再请求父ClassLoader完成

由此可得:
- 对于WEB APP线程,它的contextClassLoader是WebAppClassLoader
- 对于Tomcat Server线程,它的contextClassLoader是CatalinaClassLoader

 

org/apache/catalina/startup/Bootstrap.java:




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值