`

Tomcat的类载入器

阅读更多
[size=xx-large][/size]

1 - Tomcat的类载入器的结构

Tomcat Server在启动的时候将构造一个ClassLoader树,以保证模块的类库是私有的
Tomcat Server的ClassLoader结构如下:
        +-----------------------------+
        |         Bootstrap           |
        |             |               |
        |          System             |
        |             |               |
        |          Common             |
        |         /      \            |
        |     Catalina  Shared        |
        |               /    \        |
        |          WebApp1  WebApp2   |
        +-----------------------------+
其中:
- Bootstrap - 载入JVM自带的类和$JAVA_HOME/jre/lib/ext/*.jar
- System - 载入$CLASSPATH/*.class
- Common - 载入$CATALINA_HOME/common/...,它们对TOMCAT和所有的WEB APP都可见
- Catalina - 载入$CATALINA_HOME/server/...,它们仅对TOMCAT可见,对所有的WEB APP都不可见
- Shared - 载入$CATALINA_HOME/shared/...,它们仅对所有WEB APP可见,对TOMCAT不可见(也不必见)
- WebApp? - 载入ContextBase?/WEB-INF/...,它们仅对该WEB APP可见

2 - ClassLoader的工作原理

每个运行中的线程都有一个成员contextClassLoader,用来在运行时动态地载入其它类
系统默认的contextClassLoader是systemClassLoader,所以一般而言java程序在执行时可以使用JVM自带的类、$JAVA_HOME/jre/lib/ext/中的类和$CLASSPATH/中的类
可以使用Thread.currentThread().setContextClassLoader(...);更改当前线程的contextClassLoader,来改变其载入类的行为

ClassLoader被组织成树形,一般的工作原理是:
1) 线程需要用到某个类,于是contextClassLoader被请求来载入该类
2) contextClassLoader请求它的父ClassLoader来完成该载入请求
3) 如果父ClassLoader无法载入类,则contextClassLoader试图自己来载入

注意:WebApp?ClassLoader的工作原理和上述有少许不同:
它先试图自己载入类(在ContextBase?/WEB-INF/...中载入类),如果无法载入,再请求父ClassLoader完成

由此可得:
- 对于WEB APP线程,它的contextClassLoader是WebApp?ClassLoader
- 对于Tomcat Server线程,它的contextClassLoader是CatalinaClassLoader
3 - 部分原代码分析
3.1 - org/apache/catalina/startup/Bootstrap.java

Tomcat Server线程的起点
构造ClassLoader树,并设置Tomcat Server线程的contextClassLoader为catalinaloader
载入若干类,然后转入org.apache.catalina.startup.Catalina类中

[查看代码]
3.2 - org/apache/catalina/startup/ClassLoaderFactory.java

根据设置创建并返回StandardClassLoader的实例

[查看代码]
3.3 - org/apache/catalina/loader/StandardClassLoader.java

类载入器
3.4 - org/apache/catalina/startup/SecurityClassLoad.java

该类仅包含一个静态方法,用来为catalinaLoader载入一些类

[查看代码]
Appendix - 参考

[1] http://jakarta.apache.org/tomcat/中的Tomcat 4.1.x文档Class Loader HOW-TO
分享到:
评论

相关推荐

    tomcat 源码分析系列文档

    2. "Tomcat的类载入器以及源码分析.doc":详细介绍了Tomcat的类加载器,如WebappClassLoader,它如何根据不同的web应用程序加载类,以及如何避免类冲突。 3. "理解Tomcat的WebappClassLoader(web应用类加载器)一....

    《深入剖析Tomcat(中文版+英文版)》.rar

    第8章 载入器 第9章 session管理 第10章 安全性 第11章 standardwrapper 第12章 standardcontext类 第13章 host和engine 第14章 服务器组件和服务组件 第15章 digester库 第16章 关闭钩子 第17章 启动...

    最简化tomcat设计,socket,web服务器

    4,如果访问的是sevlet,则使用类加载器,根据configServlet.xml中配置的参数,查找对应的class,载入 5,最后执行方法. 6,可扩展开发,在com.cm.util包下,可编写专门读取txt,ini,propertie等文件的实现类, 当然...

    How Tomcat Works: A Guide to Developing Your Own Java Servlet Container

    8.5.1 创建类载入器 55 8.5.2 设置repository 55 8.5.3 设置类路径 56 8.5.4 设置访问权限 56 8.5.5 开启新线程执行类的重新载入 56 8.6 WebappClassLoader类 57 8.6.1 类缓存 58 8.6.2 载入类 59 8.6.3 应用程序 59...

    在可执行jar中载入第三方jar的几个解决方法

    6. **使用容器或服务器**:在某些情况下,如Tomcat、Jetty等应用服务器或Spring Boot这样的微服务框架,它们有自己的类加载机制,可以更好地处理多JAR依赖关系。 每种解决方案都有其适用场景和优缺点,选择哪种方法...

    spring4.3.9相关jar包

    spring-web.jar(必须) :这个jar 文件包含Web 应用开发时,用到Spring 框架时所需的核心类,包括自动载入Web Application Context 特性的类、Struts 与JSF 集成类、文件上传的支持类、Filter 类和大量工具辅助类。...

    apache-commons源码及jar文件

    Launcher 组件是一个交叉平台的Java 应用载入器。 Commons-launcher 消除了需要批处理或者Shell脚本来载入Java 类。.原始的 Java 类来自于Jakarta Tomcat 4.0 项目 Logging Commons-Logging 是一个各种 logging API...

    XXL-JOB使用规范1

    - **c) 载入配置文件**:确保Spring能够读取并加载这个配置文件。 - **d) 添加 spring-xxl-job.xml**:创建一个XML配置文件,用于配置Job的执行器。 - **e) 配置到 web 容器中**:在web.xml中配置Spring启动以及...

    ActionScript开发技术大全

    9.2文档类绑定和元件类绑定 194 9.2.1Flash文档类绑定 195 9.2.2元件类绑定 196 9.3小结 198 第10章对象交互与事件???199 10.1ActionScript3.0事件模型 199 10.1.1事件流 200 10.1.2事件侦听器 204 10.2事件对象 208...

    spring快速入门教程

    - 配置 Spring 的事务管理器,以便于在业务逻辑层中使用声明式事务管理。 5. **载入 Spring 的 applicationContext.xml 文件**: - 编写 Spring 的配置文件 `applicationContext.xml`,并在其中定义所有的 Bean ...

    JSP动态网页制作.docx

    要使用 JSP,需要安装 Java 2 软件开发工具(JSDK)、JavaServer 网站开发工具(JSWDK)或 Tomcat 等网络效劳器。Sun 免费提供 JSDK 与 JSWDK 来供 Windows、Solaris 以及 Linux 平台使用。 安装 JSP 需要下载并...

    spring快速开发入门教程

    - **示例**:通过配置Hibernate SessionFactory并设置事务管理器,可以确保在执行特定业务逻辑时自动开启和提交事务。 3. **载入Spring的applicationContext.xml文件** - applicationContext.xml是Spring的核心...

    Spring-MVC-step-by中文版.pdf

    - **第23步:添加ANT任务来创建和载入测试数据** 介绍如何通过构建脚本来自动化数据库初始化的过程。 - **第24步:为JDBC创建一个数据访问对象(DAO)的实现** 设计并实现数据访问层(Data Access Layer),通过...

    java环境配置及验证方法

    5. 启用 servlet 重新载入功能 6. 启用 root 上下文 7. 开启 servlet 调用器 8. 增加 DOS 的内存限制 9. 设置 CATALINA_HOME 五、测试服务器 配置服务器后,需要测试服务器是否正确工作。可以通过以下步骤测试...

    spring基础教程

    - **下载所需组件**:首先需要下载JDK1.4.2及以上版本、Tomcat5.0+、Ant1.6.1+等相关组件,并设置必要的环境变量。 - **Equinox框架介绍**:Equinox是一个为开发Struts-Spring式程序提供的基础框架,它已经预设了...

    Spring基础教程

    Spring的applicationContext.xml文件是Spring容器的核心,它负责载入应用程序的配置信息,包括数据源、事务管理器等。 在业务层中,我们将使用Spring来设置业务代理(businessdelegates)和数据访问对象(DAO)的依赖性...

    web技术应用基础应用复习资料.doc

    30. **Tomcat配置**:Tomcat服务器默认端口是8080,可在`server.xml`中修改,Web项目部署描述符文件是`web.xml`,内容区分大小写。 31. **JavaBean**:JavaBean是符合一定规范的Java类,用于封装业务逻辑和数据。 ...

    web技术应用基础应用复习资料.pdf

    20. MVC 将应用程序分为3 个核心模块,分别是模型、视图和控制器。MVC 模式是一种常见的软件设计模式,能够实现应用程序的模块化和解耦。 21. 异常的处理,可以在该方法的代码段中包含3 类代码:try、catch 和...

Global site tag (gtag.js) - Google Analytics