Tomcat7---类是怎样被加载的

最好先了解Java的双亲委派机制再看这篇文章。

总体架构

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

类加载器定义

  • Bootstrap 这个类加载器包含Java虚拟机提供的基本运行时类,以及来自System Extensions目录
    $JAVA_HOME/jre/lib/ext)中的JAR文件的全部类。注意:有些JVM可能将其实现为多个类加载器,好比HotSpot就分为启动类加载器(Bootstrap ClassLoader)和扩展类加载器(Extension ClassLoader)。
  • System 这个类加载器一般是经过CLASSPATH环境变量的内容初始化的。 全部这些类对于Tomcat和Web应用程序都是可见的。可是,标准Tomcat启动脚本($CATALINA_HOME/bin/catalina.sh%CATALINA_HOME%\bin\catalina.bat)彻底忽略了CLASSPATH环境变量自己的内容,而是从如下存储库(repositories)构建System类加载器:html

    1. $CATALINA_HOME/bin/bootstrap.jar:包含用于初始化Tomcat服务器的main()`方法以及它所依赖的类加载器实现类。
    2. $CATALINA_BASE/bin/tomcat-juli.jar或者$CATALINA_HOME/bin/tomcat-juli.jar:日志实现类。其中包括称为Tomcat JULIjava.util.loggingAPI的加强类以及由Tomcat内部使用的ApacheCommons Logging库的软件包重命名副本。
  • Common
    这个类加载器包含了对Tomcat内部类和全部Web应用程序均可见的其余类。一般,应用程序类别不该放置在此处。这个类加载器搜索的位置由$CATALINA_BASE/conf/catalina.properties中的common.loader属性定义。默认设置将按照它们列出的顺序搜索如下位置:java

    1. $CATALINA_BASE/lib下没打包的classes和资源文件
    2. $CATALINA_BASE/lib下的jar
    3. $CATALINA_HOME/lib下没打包的classes和资源文件
    4. $CATALINA_HOME/lib下的jar
  • WebappX 为每一个部署在单个Tomcat实例中的Web应用程序建立类加载器。
    Web应用程序的/WEB-INF/classes目录中的全部未打包的类和资源,以及Web应用程序的/WEB-INF/lib目录下的JAR文件中的类和资源均可以被此Web应用程序访问,但不能访问到其余的。

    如上所述,Web应用程序类加载器与默认的Java委托模型不一样(即双亲委派)。当处理从Web应用程序的WebappX类加载器加载类的请求时,该类加载器将首先在本地存储库中查找,而不是在查找以前进行委托。 可是有例外,做为JRE基类的一部分的类不能被覆盖。例如J2SE 1.4+中的XML解析器组件,以及Java 8将会使用的类。最后,包含Servlet API类的任何JAR文件将被类加载器显式忽略 - 你的Web应用程序中不该该包含这些类。 Tomcat中的全部其余类加载器都遵循一般的代理模式。web

所以,从Web应用程序的角度来看,类或资源加载按如下顺序在如下存储库中查找:
  1. Bootstrap classes of your JVM
  2. web应用的/WEB-INF/classes
  3. web应用的/WEB-INF/lib/*.jar
  4. System class loader classes (如上所述)
  5. Common class loader classes (如上所述)
若是Web应用程序类加载器配置为<Loader delegate ="true"/>,那么顺序将变为:
  1. Bootstrap classes of your JVM
  2. System class loader classes (如上所述)
  3. Common class loader classes (如上所述)
  4. web应用的/WEB-INF/classes
  5. web应用的/WEB-INF/lib/*.jar

资料apache

相关文章
相关标签/搜索