tomact classloader机制

简介:

官方原文: http://tomcat.apache.org/tomcat-5.5-doc/class-loader-howto.html

当Tomcat5启动以后,它创建一系列类加载器。这些类加载器以父子关系组织在一起,父类加载器在子类加载器的上面:

Bootstrap
 |
 System
 |
Common
/    \
Catalina Shared
          /        \
 Webapp1 Webapp2 ...   ( tomact classloader类层次结构)

  Bootstrap - 这个类加载器可以加载Java虚拟机的运行时基础类,以及在系统扩展目录($JAVA_HOME/jre/lib/ext)中的所有Jar包中的类。

  System - 这个类加载器一般可以加载CLASSPATH环境变量的内容。所有加载的类对于Tomcat内部的类和web应用程序的都是可见的。尽管如此,标准的Tomcat5启动脚本($CATALINA_HOME/bin/catalina.sh 或 %CATALINA_HOME%\bin\catalina.bat)会优先加载如下JAR包:
$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目录下放置未打包的类和资源,commons/endorsed、commons/i18n、common/lib目录下的Jar包中的类和资源都是这个类加载器的加载对象。tomact安装后默认包括如下内容:
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或者 /server/lib/ 。默认情况,包括个如下内容:
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应用程序。可放置在$CATALINA_BASE/shared/classes或者 /shared/lib。

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中的其他的类加载器使用正常托管模式。



最后总结一下。

common :  tomact server 和 webapp 共享
shared : webapp 共享
server :  tomact server 共享
bin :   tomact 服务初始化

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

# JVM启动
Bootstrap classes of your JVM                         

# tomact服务启动
System class loader classses (described above)   

# web 服务启动
/WEB-INF/classes                                          
/WEB-INF/lib/*.jar   

# 加载tomact和webapp 共享common包
$CATALINA_HOME/common/classes
$CATALINA_HOME/common/endorsed/*.jar
$CATALINA_HOME/common/i18n/*.jar
$CATALINA_HOME/common/lib/*.jar 
  
# 加载webapp共享包
$CATALINA_BASE/shared/classes
$CATALINA_BASE/shared/lib/*.jar 
相关文章
|
数据安全/隐私保护
fastadmin是如何设置没有权限的用户不能访问某些页面的?
fastadmin是如何设置没有权限的用户不能访问某些页面的?
772 0
|
10月前
|
应用服务中间件 nginx Docker
【与时俱进】网络工程师必备技能:Docker基础入门指南,助你轻松应对新时代挑战!
【8月更文挑战第22天】随着容器技术的发展,Docker已成为开发与运维的关键工具。本文简要介绍Docker——一种开源容器化平台,能让应用程序及依赖项被打包成轻量级容器,在任何Linux或Windows机器上运行。文中涵盖Docker的安装步骤、基础命令操作如启动服务、查看版本、拉取与运行容器等。并通过实例演示了如何运行Nginx服务器和基于Dockerfile构建Python Flask应用镜像的过程。这些基础知识将助力网络工程师理解Docker的核心功能,并为实际应用提供指导。
133 2
|
7月前
|
Java
被final修饰的类的所有方法都不能被重写吗
在Java中,被`final`修饰的类不能被继承,因此其所有方法也不能被重写。`final`关键字确保了类的定义和行为不会被子类改变。
340 3
|
7月前
|
缓存 API PHP
PHP性能优化:从基础到高级策略####
深入探索PHP性能优化的多维度策略,本文旨在揭示通过代码优化、配置调整与现代最佳实践相结合的方式,显著提升PHP应用的响应速度和资源利用率。不涉及传统摘要细节,直接聚焦于技术深度与实用技巧,引领读者踏上PHP性能调优的高效之旅。 ####
|
7月前
|
人工智能 自然语言处理 安全
文生视频大模型
Sora 是由 OpenAI 发布的一款文本生成视频的人工智能模型,能够在理解文本的基础上生成高质量的视频内容。Sora 具备 3D 一致性、远程相干性和物体持久性等特性,但目前仍处于测试阶段,仅限特定专家使用,以确保其安全性。
|
关系型数据库 MySQL OLAP
PolarDB +AnalyticDB Zero-ETL :免费同步数据到ADB,享受数据流通新体验
Zero-ETL是阿里云瑶池数据库提供的服务,旨在简化传统ETL流程的复杂性和成本,提高数据实时性。降低数据同步成本,允许用户快速在AnalyticDB中对PolarDB数据进行分析,降低了30%的数据接入成本,提升了60%的建仓效率。 Zero-ETL特性包括免费的PolarDB MySQL联邦分析和PolarDB-X元数据自动同步,提供一体化的事务处理和数据分析,并能整合多个数据源。用户只需简单配置即可实现数据同步和实时分析。
|
11月前
|
自然语言处理 算法 安全
Python实现贝叶斯算法疫情微博评论情感分析
Python实现贝叶斯算法疫情微博评论情感分析
Python实现贝叶斯算法疫情微博评论情感分析
|
数据采集 Web App开发 iOS开发
爬取B站评论:Python技术实现详解
爬取B站评论:Python技术实现详解
|
存储 安全 编译器
[Eigen中文文档] 常见的陷阱
本文将介绍一些Eigen常见的陷阱
456 0
|
Android开发
通过反射方式获取Android设备系统属性
通过反射方式获取Android设备系统属性 【5月更文挑战第1天】
206 2