Tomcat的类载入器

转载 2004年08月06日 16:47:00

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(8)载入器

【0】README 0.0)本文部分描述转自“深入剖析tomcat”,旨在学习 tomcat(8)载入器 的基础知识; 0.1)一个标准web 应用程序中的载入器:简单来说就是 tomcat中的载入器...
  • PacosonSWJTU
  • PacosonSWJTU
  • 2016年04月23日 18:18
  • 9217

深入剖析Tomcat 第八章 载入器

tomcat
  • zxd1435513775
  • zxd1435513775
  • 2017年03月28日 15:57
  • 161

java的类载入器

【0】README0.1)本文文字转自: 深入剖析tomcat, 旨在 理解 jvm 的类载入器;【1】 jvm的类载入器相关1)jvm 使用了3种类载入器来载入所需要的类:分别是引导类载入器(boo...
  • PacosonSWJTU
  • PacosonSWJTU
  • 2016年03月04日 10:44
  • 358

Tomcat源码分析(八)--载入器

在讲Tomcat的载入器之前,先要了解一下Java的类加载机制,这里就不具体说了,仅仅写一点我认为比较重要的东西:     1:一般实现自己的类加载器是重写ClassLoader的findCla...
  • clypm
  • clypm
  • 2016年06月17日 15:38
  • 116

Java的类载入器

每次创建Java类的实例时,都必须现将类载入到内存中。Java虚拟机使用类载入器来载入需要的类。一般情况下,类在如期会在一些Java核心类库,以及环境变量CLASSPATH中指明的目录中搜索相关类。如...
  • baolongf
  • baolongf
  • 2014年08月06日 17:49
  • 448

how tomcat works 读书笔记 八 载入器下

载入类 我们看看之前的文章,这一节就从SimpleWrapper的loadServlet讲起。 SimpleWrapper.java如下(省略了try catch及其他部分代码) public Ser...
  • dlf123321
  • dlf123321
  • 2014年10月30日 15:16
  • 1092

java与tomcat7类加载机制

1. java类加载器近来了解tomcat的类加载机制,所以先回顾一下java虚拟机类加载器,如果从java虚拟机的角度来看的话,其实类加载器只分为两种:一种是启动类加载器(即Bootstrap Cl...
  • czmacd
  • czmacd
  • 2017年01月04日 11:03
  • 1716

How Tomcat Works 读书笔记 八 载入器 上

Java的类载入器 详细资料见 http://blog.csdn.net/dlf123321/article/details/40431297 首先说明两个术语 仓库(repository),表示类...
  • dlf123321
  • dlf123321
  • 2014年10月29日 13:21
  • 1358

TomCat类加载器结构

一个功能健全的类加载器,都要解决以下几个问题: (1)部署在同一服务器上的两个web应用程序所使用的java类库可以实现相互隔离。这是最基本的需求,两个不同的应用程序可能会依赖同一个第三方类库的不同...
  • u011393781
  • u011393781
  • 2016年10月21日 16:23
  • 588

Tomcat类加载器机制(Tomcat源码解析六)

要说Tomcat的Classloader机制,我们还得从Bootstrap开始。在BootStrap初始化的时候,调用了org.apache.catalina.startup.Bootstrap#in...
  • jiaomingliang
  • jiaomingliang
  • 2015年08月11日 10:28
  • 3032
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Tomcat的类载入器
举报原因:
原因补充:

(最多只允许输入30个字)