tomcat 2.2.1 tomcat7类加载器HOWTO-中文翻译



0. 原文地址

apache tomcat7 class-loader-howto


1. 翻译内容

1) 概述

和许多服务器应用一样,tomcat安装了各种类加载器(也就是实现java.lang.ClassLoader的类),以允许容器的不同部分以及容器上运行的Web应用程序访问不同的可用类和资源的存储库。该机制用于提供Servlet规范2.4版中定义的功能,特别是9.4和9.6节。

在java环境中,类加载器是以亲子树的形式排列。一般情况下,当一个类加载器被要求加载一个特定的类或资源时,它首先把请求发送给它的父类加载器,只有当父类加载器无法找到该资源时,它才在自己的类库中查询。

不过值得注意的是,Web应用程序类加载器采用的模型与此稍有不同,在接下来的内容中会提到,但是主要原则是相同的。

当tomcat启动时,它会创建一个类加载器集合,以如下的父加载器在子加载器之上的亲子关系组织:

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

这些类加载器的特征,包括它们可见的类和资源的来源,将会在以下部分中详细讨论。

2) 类加载器定义

如上面架构图所示,Tomcat在初始化时创建以下类加载器:

默认情况下,它包含以下内容

前面提到过,web应用程序类加载器和默认的java委托模式(根据Servlet规范2.4版第9.7.2节Web应用程序类加载器中的建议)不同,当处理从Web应用程序的WebappX类加载器加载类的请求时,此类加载器将首先查找本身存储库,而不是委派给父类先去查找。不过也有例外,作为JRE基类一部分的类不能被覆盖。对于某些类(例如J2SE 1.4+中的XML解析器组件),可以使用J2SE 1.4认可的功能。最后,包含Servlet API类的任何JAR文件都将被类加载器显式忽略 – 不要在您的Web应用程序中包含这样的JAR。Tomcat中的所有其他类加载器遵循通常的委托模式。

因此,从Web应用程序的角度来看,类或资源加载将按以下顺序查找以下存储库:

如果Web应用程序类加载器配置为,则该顺序变为:

3) XML解析器和Java

从Java 1.4开始,JAXP API和XML解析器的一个副本被打包在JRE中。这对希望使用自己的XML解析器的应用程序有影响。

在旧版本的Tomcat中,您可以简单地替换Tomcat libraries目录中的XML解析器来更改所有Web应用程序使用的解析器。然而,当您运行Java的现代版本时,这种技术将无效,因为通常的类加载器委派过程将始终选择JDK内的实现。

Java支持称为“支持标准覆盖机制”的机制,以允许替换在JCP之外创建的API(例如来自W3C的DOM和SAX)。它也可以用于更新XML解析器实现。有关详细信息,请参阅:http://docs.oracle.com/javase/1.5.0/docs/guide/standards/index.html

Tomcat通过在启动容器的命令行中包含系统属性设置-Djava.endorsed.dirs=$JAVA_ENDORSED_DIRS来使用此机制。此选项的默认值为$CATALINA_HOME/endorsed。默认情况下不创建该目录。

4) 在安全管理器下运行

在安全管理器下运行允许加载类的位置也将取决于策略文件的内容。有关更多信息,请参阅安全管理器HOW-TO