Apache Tomcat Servlet/JSP容器

Apache Tomcat 5.5 Servlet/JSP容器

Apache徽标

链接

用户指南

参考

Apache Tomcat开发

Apache Tomcat 5.5 Servlet/JSP容器

类加载器操作方法

目录
快速入门

以下规则涵盖了大约95%的应用决策开发人员和部署人员必须确定类和资源的位置文件以使其可用于web应用程序:

  • 对于特定于特定web应用程序的类和资源,将未打包的类和资源放在/WEB-INF/类或放置包含这些内容的JAR文件下的类和资源/WEB-INF/库您的网络应用程序存档。
  • 对于必须在所有web应用程序中共享的类和资源,将未打包的类和资源放在$CATALINA_BASE/共享/类,或放置JAR文件包含这些类和资源$CATALINA_BASE/shared/lib.
概述

与许多服务器应用程序一样,Tomcat 5安装了各种类加载器(即,实现java.lang.ClassLoader(java.lang.ClassLoader))允许容器的不同部分,以及在容器,以访问可用类的不同存储库和资源。此机制用于提供Servlet规范,版本2.4——特别是第9.4和9.6节。

在J2SE2(即J2SE1.2或更高版本)环境中,类装入器是排列在父子树中。通常,当要求类装入器加载特定的类或资源,它将请求委托给父级首先是类加载器,然后仅当父类类加载器找不到请求的类或资源。的模型web应用程序类加载器与此略有不同(如下所述),但主要原则是相同的。

启动Tomcat 5时,它会创建一组类加载器组织为以下父子关系,其中父类装入器位于子类装入器之上:

引导程序|系统|通用/      \Catalina共享/   \Webapp1 Webapp2。。。

每个类装入器的特征,包括源代码中详细讨论了它们使之可见的类和资源以下部分。

类加载器定义

如上图所示,Tomcat5创建了以下类加载程序初始化时:

  • 引导程序-这个类加载器包含基本运行时Java虚拟机提供的类,以及JAR中的任何类系统扩展目录中存在的文件($JAVA_HOME/jre/lib/ext).注释-一些JVM可能将其实现为多个类加载器,否则它可能不可见(作为类加载器)。
  • 系统-此类加载器通常从初始化的内容类路径环境变量。所有这些类对Tomcat内部类和web都可见应用。然而,标准Tomcat 5启动脚本($CATALINA_HOME/bin/CATALINA.sh%CATALINA_HOME%\bin\CATALINA.bat目录)完全忽略内容类路径环境变量本身,而不是从以下存储库构建系统类加载器:
    • $CATALINA_HOME/bin/bootstrap.jar-包含main()方法用于初始化Tomcat 5服务器和类加载器它所依赖的实现类。
    • $JAVA_HOME/lib/tools.jar-包含使用的“javac”编译器将JSP页面转换为servlet类。
    • $CATALINA_HOME/bin/commons-logging-api-x.y.z.jar-雅加达commons日志API。
    • $CATALINA_HOME/bin/commons-daemon.jar-雅加达公地守护程序API。
    • jmx.jar文件-JMX 1.2实现。
  • 通用-这个类加载器包含其他类对Tomcat内部类和所有web都可见的应用。通常,应用程序类应该不是放在这里。中的所有未打包类和资源$CATALINA_HOME/公共/类,以及类和JAR文件中的资源$CATALINA_HOME/commons/已背书,$CATALINA_HOME/commons/i18n$CATALINA_HOME/common/lib目录,通过这个可以看到类加载器。默认情况下,包括以下内容:
    • 通用-el.jar-雅加达公地,实施贾斯珀使用的表达语言。
    • ecj-x.y.x.jar-Eclipse JDT Java编译器。
    • jasper-编译器.jar-JSP2.0编译器。
    • 碧玉红.jar-JSP2.0运行时。
    • jsp-api.jar-JSP 2.0 API。
    • 命名通用jar-Tomcat 5使用的JNDI实现表示内存中的命名上下文。
    • 命名工厂.jar-Tomcat 5使用的JNDI实现解析对企业资源的引用(EJB、连接池)。
    • 命名因子-dbcp.jar-雅加达公共DBCP,提供web应用程序的JDBC连接池。班级已被转移脱离其默认的org.apache.commons包。
    • 命名-java.jar-java:命名空间的处理程序。
    • 命名资源.jar-专用JNDI命名上下文用于表示web静态资源的实现应用程序。这与J2EE ENC的支持无关,并且无法删除。
    • servlet-api.jar-Servlet 2.4 API。
    • tomcat-i18n-**.jar-包含资源包的可选JAR用于其他语言。每个包中还包含默认包单个JAR,如果没有国际化,它们可以安全删除需要条消息(共条)。
  • 卡特琳娜-这个类加载器被初始化为包含实现Tomcat 5本身所需的所有类和资源。这些类和资源是完全地对网络不可见应用。中的所有未打包类和资源$CATALINA_HOME/服务器/类,以及类和JAR文件中的资源$CATALINA_HOME/服务器/lib,通过这个类加载器。默认情况下,包括以下内容:
    • catalina.jar(加泰罗尼亚)-Catalina servlet的实现Tomcat 5的容器部分。
    • catalina-ant.jar(催化器)-一些Ant任务可用于使用管理器web应用程序管理Tomcat。
    • catalina-optional.jar催化剂-的一些可选组件卡塔琳娜。
    • commons-modeler.jar-使用的模型MBeans实现Tomcat通过JMX公开其内部对象。
    • servlets-xxxxx.jar-与每个提供Tomcat部分功能的内部servlet。这些都是分开的,因此如果不需要相应的服务,或者可以接受专门的安全管理器权限。
    • tomcat-coyote.jar-郊狼API。
    • tomcat-http.jar-独立Java HTTP/1.1连接器。
    • tomcat-ajp.jar-的Java部分的类AJP公司web服务器连接器,它允许Tomcat在Apache、iPlanet iAS和iWS等web服务器后面运行。
    • tomcat-util.jar-一些公司要求的公用设施等级Tomcat连接器。
  • 共享-这个类加载器是放置类的地方和您希望共享的资源所有web应用程序(除非Tomcat内部类也需要访问,在这种情况下,你应该把它们放在通用类加载器)。中的所有未打包类和资源$CATALINA_BASE/共享/类,以及类和JAR文件中的资源$CATALINA_BASE/shared/lib,是通过这个类加载器可见。如果有多个Tomcat实例使用$CATALINA_BASE环境变量从相同的二进制文件运行,那么这个类加载器存储库是相对于$CATALINA_BASE的而不是$CATALINA_HOME。
  • 网络应用X-为每个web创建一个类加载器部署在单个Tomcat 5实例中的应用程序。全部未打包中的类和资源/WEB-INF/类的目录您的web应用程序存档,以及JAR文件中的类和资源/WEB-INF/库web应用程序的目录存档,对包含的web应用程序可见,但对没有其他人。

如上所述,web应用程序类装入器与默认的Java 2委派模型(根据Servlet规范,版本2.3,第9.7.2节Web应用程序类加载器)。当请求加载从web应用程序的网络应用X处理类加载器,这个类加载器将在本地存储库中查找第一,而不是先授权再看。也有例外。以下类别无法重写JRE基类的一部分。对于某些类(例如J2SE 1.4+中的XML解析器组件),J2SE 1.4认可的特性可以是已使用(请参阅上面的通用类加载器定义)。最后,任何包含servlet API类的JAR都将被类加载器。Tomcat 5中的所有其他类装入器都遵循通常的委托模式。

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

  • JVM的引导类
  • 系统类装入器类(如上所述)
  • /WEB-INF/类web应用程序的
  • /网址-INF/lib/*.jar的web应用程序
  • $CATALINA_HOME/通用/类
  • $CATALINA_HOME/commond/endorded/*.jar
  • $CATALINA_HOME/common/i18n/*.jar
  • $CATALINA_HOME/common/lib/*.jar
  • $CATALINA_BASE/共享/类
  • $CATALINA_BASE/shared/lib/*.jar
XML解析器和J2SE 1.4

在许多其他更改中,J2SE 1.4版本打包了JAXP APIXerces的一个版本,位于JRE中。这会对以下应用程序产生影响:希望使用自己的XML解析器。

在Tomcat 5的早期版本中,您可以简单地替换XML解析器在中$CATALINA_HOME/common/lib目录以更改解析器由所有web应用程序使用。然而,这项技术不会有效当您在J2SE1.4上运行时,因为通常的类加载器委托进程总是优先选择JDK内部的实现到这个。

JDK 1.4支持一种称为“认可标准覆盖”的机制机制”以允许替换在JCP之外创建的API(即。来自W3C的DOM和SAX)。它还可以用于更新XML解析器实施。有关详细信息,请参阅:http://java.sun.com/j2se/1.4/docs/guide/standards/index.html.

Tomcat通过包含系统属性设置来利用此机制-Djava.endorded.dirs=$CATALINA_HOME/common/endorded在中启动容器的命令行。因此,您可以替换安装在此目录中的解析器,它甚至可以在JDK 1.4系统。

在安全管理器下运行

在安全管理器下运行时,类所在的位置是否允许加载也取决于您的策略的内容文件。请参见安全经理操作方法了解更多信息。


版权所有©1999-2012,Apache Software Foundation