`

Tomcat Class Loader

 
阅读更多
 

当Tomcat5启动以后,它创建一系列类加载器。这些类加载器以父子关系组织在一起,父类加载器在子类加载器的上面:

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

这些类加载器所扮演的角色,以及它们可以见到的类和资源的规则如下:

如上图所示,Tomcat5 在初始化的时候创建如下类加载器:

Bootstrap
- 这个类加载器可以加载Java虚拟机的运行时基础类,以及在系统扩展目录($JAVA_HOME/jre/lib/ext)中的所有Jar包中的类。注意-一些JVM可能用多个类加载器来实现它,或者它是根本不能被看见的。

System
- 这个类加载器一般可以加载CLASSPATH环境变量的内容。所有这个类对于Tomcat内部的类和web应用程序的都是可见的。尽管如此,标准的Tomcat5启动脚本($CATALINA_HOME/bin/catalina.sh 或 %CATALINA_HOME%\bin\catalina.bat)都会忽略CLASSPATH环境变量,取而代之的是从如下仓库加载:

  • $CATALINA_HOME/bin/bootstrap.jar - 包含Tomcat5 服务器初始化的main()方法,以及所需的类加载器的实现类。
  • $JAVA_HOME/lib/tools.jar - 包括把JSP页面编译成Serlet类所需的"javac"编译器.
  • $CATALINA_HOME/bin/commons-logging-api.jar - Jakarta commons logging API.
  • $CATALINA_HOME/bin/commons-daemon.jar - Jakarta commons daemon API.
  • jmx.jar - The JMX 1.2 实现.

Common - 这个类加载器可以使一些附加的类对于Tomcat内部的类和web应用程序可见。正常情况下,应用程序不应该替换它。所有$CATALINA_HOME/common/classes目录下的未打包类和资源,以及$CATALINA_HOME/commons/endorsed、$CATALINA_HOME/commons/i18n、$CATALINA_HOME/common/lib目录下的Jar包中的类和资源都是这个类加载器的加载对象。默认情况,包括如下内容:         

  • commons-el.jar - Jakarta commons el, Jasper用的EL表达式实现
  • jasper-compiler.jar - The JSP 2.0 编译器.
  • jasper-compiler-jdt.jar - The Eclipse JDT Java 编译器.
  • jasper-runtime.jar - The JSP 2.0 运行库.
  • jsp-api.jar - The JSP 2.0 API.
  • naming-common.jar - Tomcat5的JNDI 实现,用于内存命名环境
  • naming-factory.jar - Tomcat5的JNDI 实现,用于企业级资源引用(EJB, connection pools).
  • naming-factory-dbcp.jar - Jakarta commons DBCP, 为Web应用程序提供JDBC连接池。这个类已经从默认的org.apache.commons包中移出。
  • naming-java.jar -  java命名空间处理器.
  • naming-resources.jar - The specialized JNDI naming context implementation used to represent the static resources of a web application. This is not related to the support of the J2EE ENC, and cannot be removed.
  • servlet-api.jar - The Servlet 2.4 API.
  • 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.

Catalina - 这个类加载器主要加载Tomcat5自己所需要的类和资源。这些类和资源对于Web应用程序是完全不可见的。在$CATALINA_HOME/server/classes目录下的所有类和资源,$CATALINA_HOME/server/lib下的所有Jar包中类和资源是这个类加载器的加载对象。默认情况,包括个如下内容:

  • catalina.jar - Tomcat5中Catalina Servlet容器的实现部分。
  • catalina-ant.jar - 在管理web应用程序时要用倒的一些Ant任务。
  • catalina-optional.jar - 一些Catalina可选组件。
  • commons-modeler.jar - Tomcat通过JMX暴露其内部对象是用的一些MBean实现。
  • servlets-xxxxx.jar - 这些类同内部的Servlet一起提供Tomcat的部分功能,它们都是独立的,所以如果不需要相应的服务可以将其删除。或者它们可以从属于特定的安全管理器。
  • tomcat-coyote.jar - Coyote API.。
  • tomcat-http.jar - 标准的Java HTTP/1.1 连接器.。
  • tomcat-ajp.jar - AJP web 服务器的连接器,一般用于Apache,iPlanet iAS和 iWS.。
  • tomcat-util.jar - Tomcat连接器需要的工具类。

Shared - 这个类加载器用于把一些类和资源共享给所有的web应用程序。(除非Tomcat内部的类也需要访问这些类,在这种情况下你应该把它们放在Common类加载能加载的地方). 在$CATALINA_BASE/shared/classes目录下的所有未打包类和资源,以及$CATALINA_BASE/shared/lib目录下的所有Jar包中的类和资源可以被其加载。如果通过$CATALINA_BASE环境变量来从同一个tomcat程序运行了多个在实例,那么这个类加载器的仓库是相对于$CATALINA_BASE而不是$CATALINA_HOME。 

WebappX - 系统会为部署在一个Tomcat实例中的每个应用程序创建一个这样的类加载器,它们为所属的应用程序加载类。所有你的web应用程序包的/WEB-INF/classes目录下的类和资源,以及
/WEB-INF/lib 目录下的所有Jar包中的类和资源是这个类的加载对象。这些类和资源仅对这个应用程序可见,并且这个应用程序也看不见其他应用程序的类和资源。

就像上面所描述的,web应用程序的类加载的加载流程与默认的Java 2的类记载托管模型是不一样的。当有一个请求需要应用程序的WebappX 类加载器加载一个类的时候,这个类加载器是首先到自己的仓库中查找,而不是先交给上面的类加载器查找。这里有一些例外。JRE的基础类是不能被覆盖的。对于其他一些类(如J2SE 1.4+中的XML解析器组件),可以使用J2SE1.4的签名特性。最后任何包括servlet API类的Jar包会被忽略。Tomcat5中的其他的类加载器使用正常托管模式。

这样在一个web应用程序中,类和资源的加载顺序是这样:

 

  • 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/common/classes
  • $CATALINA_HOME/common/endorsed/*.jar
  • $CATALINA_HOME/common/i18n/*.jar
  • $CATALINA_HOME/common/lib/*.jar
  • $CATALINA_BASE/shared/classes
  • $CATALINA_BASE/shared/lib/*.jar
分享到:
评论

相关推荐

    juel-Tomcat与EL冲突问题

    启动Tomcat时报错:Caused by: java.lang.LinkageError: loader constraints violated when linking javax/el/ExpressionFactory class 说明:原因是juel.jar, juel-engine.jar, juel-impl.jar包和Tomcat6.0中的el-...

    how tomcat work

    如果请求的目标是一个JSP页面,Jasper会将JSP转换为Servlet源代码,编译成.class文件,然后按照Servlet生命周期进行加载和执行。 5. **响应生成**: Servlet生成的响应内容通过Response对象返回给Coyote,再由...

    tomcat类加载器

    4. Common ClassLoader:在Tomcat中,它是所有Web应用共享的类加载器,用于加载`common.loader`配置项指定的类路径。 5. WebApp ClassLoader:每个Web应用有自己的类加载器,它加载应用的`WEB-INF/classes`和`WEB-...

    java class加密保护(完全免费) v2.1

    Tomcat、Jboss等Java application server修改启动脚本, 把执行java的命令行后面加上参数-agentlib:<动态链接库文件所在路径>\classloader 适应环境: 操作系统:所有操作系统,Windows系统、Linux/Unix,只是运行...

    java项目tomcat迁移到jboss

    Java 项目从 Tomcat 迁移到 JBoss 的解决方案 在 Java 项目中,迁移到 JBoss 可能会出现各种问题,例如版本兼容问题、设置问题等。本文将介绍如何解决这些问题,包括如何配置 JBoss,使得 Spring 项目能够正常运行...

    tomcat-bootstrap and juli.jar

    Bootstrap启动过程中的一个重要环节是类加载器(Class Loader)的构建。Tomcat使用了一种层次化的类加载机制,使得不同类型的资源和应用可以独立加载,避免了类冲突问题。Bootstrap类加载器负责加载最基础的类,然后...

    tomcat架构解析 【刘光瑞PDF高清】.rar

    3. **Jasper**:Jasper是Tomcat中的JSP编译器,将JSP页面转换为Servlet源代码,然后编译成.class文件供Java虚拟机执行。 4. **GlobalNamingResources**:这部分包含了全局的JNDI (Java Naming and Directory ...

    Tomcat7 负载Jar包

    在Tomcat7中,JAR包的加载是通过Classloading机制来实现的。Classloading是Java运行时环境的一部分,负责查找、加载和初始化类。在Tomcat中,这个过程涉及到`WEB-INF/lib`目录下的所有JAR文件。每个Web应用都有自己...

    tomcat 定时作业

    - 另一种方法是在Tomcat的Context配置文件中使用`Loader`元素的`backgroundProcessorDelay`属性。这将启动一个后台线程,每隔指定的秒数检查上下文是否需要重新加载。虽然这不是设计用于定时任务的,但可以通过扩展...

    java class加密保护工具

    Tomcat、Jboss等Java application server修改启动脚本, 把执行java的命令行后面加上参数-agentlib:<动态链接库文件所在路径>\classloader 适应环境: 操作系统:所有操作系统,Windows系统、Linux/Unix,只是运行...

    Tomcat 5.0.18 ClassLoader source code insight

    默认情况下,Tomcat采用"parent first"策略,即Webapp ClassLoader先尝试让上级Loader加载,如果上级Loader无法加载,再由自己加载。这种策略可以避免不同Web应用间的类冲突。然而,在某些情况下,开发者可能希望...

    Tomcat技术培训

    - **Jasper**:Tomcat内置的JSP引擎,负责将JSP文件转换为Java文件并编译成class文件。 - **Pipeline & Valve**:提供了一个灵活的请求处理管道机制,允许在请求/响应过程中添加自定义处理逻辑。 - **Naming**:...

    java类加载器-tomcat中的类加载器

    Java 类加载器是Java虚拟机(JVM)的核心组成部分,它负责将编译后的字节码文件(.class文件)加载到JVM中并转换为运行时的数据结构。Tomcat,作为广泛使用的Java Servlet容器,它自定义了一套类加载机制,以满足Web...

    How_Tomcat_Works 中文版

    这一过程涉及到Class Loader机制的应用,确保每个Servlet类能够正确加载。 - **会话管理**:Tomcat使用会话管理机制来跟踪用户在多次交互过程中的状态。会话管理器负责生成会话ID、存储会话数据和维护会话的有效性。...

    (JCL) Jar Class Loader-开源

    【JCL(Jar Class Loader)】是一个开源项目,它的核心功能是允许程序在运行时动态地从Jar文件或其他数据源加载Java类。JCL的设计理念是可配置、动态且可扩展,这使得开发者可以根据需求定制类加载的行为,适应不同...

    替换两个文件解决Tomcat6项目移植到JBoss5.1下的Logging异常

    -- For load class independently --> <class-loading java2ClassLoadingCompliance="true"> <loader-repository> com.example:archive=Example.war <loader-repository-config> java2ParentDelegaton=true ...

Global site tag (gtag.js) - Google Analytics