没有合适的资源?快使用搜索试试~ 我知道了~
首页Tomcat研究之ClassLoader.pdf
Tomcat研究之ClassLoader.pdf
需积分: 3 26 下载量 156 浏览量
更新于2023-07-19
收藏 128KB PDF 举报
Tomcat研究之ClassLoader.pdf 请大家抓紧下载吧,呵呵
资源详情
资源推荐
陈国庆(chen77716@hotmail.com) Page 1 5/20/2004
Tomcat 研究之 ClassLoader
在研究 Tomcat 之前,一般是借用现有的 UML 工具分析 Tomcat 整体结构,但要分析 Tomcat
的流程就必须从分析 Tomcat 的 StartUp 入手。Tomcat 的启动是从解析 bat 文件开始,bat
文件最终调用 org.apache.catalina.startup.Bootstrap 开始类的加载。
一.Tomcat 的 ClassLoader:
TOMCAT 自己的类载入器(ClassLoader)
+---------------------------+
| Bootstrap |
| | |
| System |
| | |
| Common |
| / \ |
| Catalina Shared |
+---------------------------+
其中:
- Bootstrap - 载入 JVM 自带的类和$JAVA_HOME/jre/lib/ext/*.jar
- System
1.载入
$CATALINA_HOME/bin/bootstrap.jar
初始化 Tomcat,执行 Main 方法
2
.
$JAVA_HOME/lib/tools.jar Sun 的工具类,包括编译 Jsp 为 Servlet 的工具类
-
Common 这个目录下的类虽然对 TOMCAT 和所有的 WEB APP 都可见.但是 Web App 的类不应该
放在这个目录下,所有未打包的 Class 都在$CATALINA_HOME/common/classes 下,所
有打包的 jar 都在
$CATALINA_HOME/commons/endorsed 和$CATALINA_HOME/common/lib 下,默认情况会
包含以下几个包:
1.
jndi.jar
JNDI API 接口,这个包仅在 Java1.2 时候装入,1.3 以后的版本 JDK 已
自动装入.
2.
naming-common.jar
JNDI 接口实现类,Tomcat 用这些类在内存中使用 Context.
3.
naming-resources.jar
JNDI 实现,Tomcat 用它们定位 Web App 的静态资源.
4.
servlet.jar
Servlet,Jsp API
5
. xerces.jar
XML 解析器,特定的 Web App 可以在自己的/WEB-INF/lib 中覆盖.
- Catalina 装入 Tomcat 实现所有接口的类,这些类对 Web App 是完全不可见的,所有未打包的类在
$CATALINA_HOME/server/classes 所有 jar 包在$CATALINA_HOME/server/lib 下.一
般情况该 ClassLoader 将 Load 下面几个包:
1.
catalina.jar
Servlet 容器的 Tomcat 实现包
陈国庆(chen77716@hotmail.com) Page 1 5/20/2004
陈国庆(chen77716@hotmail.com) Page 2 5/20/2004
2.
jakarta-regexp-X.Y.jar
正则表达式,请求过滤时使用
3.
servlets-xxxxx.jar
Servlet 支持包
4.
tomcat-coyote.jar
Tomcat 的 Coyote 连接实现包
5.
tomcat-jk.jar
Web Server 绑定包,允许 Tomcat 绑定 Apache 等作为 Web Server
6.
tomcat-jk2.jar
功能同上
7.
tomcat-util.jar
Tomcat 工具类,可能被一些 Connector 用到
8.
tomcat-warp.jar
用于 Apache Server 包
- Shared 载入所有 WEB APP 都可见的类,对 TOMCAT 不可见. 所有未打包的类在
$CATALINA_HOME/shared/classes 所有 jar 包在$CATALINA_HOME /lib 下.
默认情况包含下面几个包:
1.
jasper-compiler.jar
Jsp 编译器,编译 Jsp 为 Servlet
2.
jasper-runtime.jar
Jsp(已编译成 Servlet)运行支持包
3.
naming-factory.jar
支持 Web App 使用 JNDI 的封装包
-WebAppX Web App ClassLoader,当 Web App 被部署是该 ClassLoader 被创建.所有 class 都在
WEB-INF/classes 下,所有 jar 在 WEB-INF/lib 下.
特别注意 WEB APP 自己的 ClassLoader 的实现与众不同:
它先试图从 WEB APP 自己的目录里载入,如果失败则请求父 ClassLoader 的代理
这样可以让不同的 WEB APP 之间的类载入互不干扰.另,Tomcat Server 使用的是 Catalina
ClassLoader,一般的 Web App 使用的是 WebApp ClassLoader.
二.
org.apache.catalina.startup.Bootstrap
该类是 Tomcat 的执行入口点,我们着重分析下面两个方法:
1. initClassLoaders,创建 ClassLoader 层次.
private void initClassLoaders() {
try {
ClassLoaderFactory.setDebug(debug);
//创建 common ClassLoader,没有父 ClassLoader
commonLoader = createClassLoader("common", null);
//创建 catalina ClassLoader,父 ClassLoader 为 common
catalinaLoader = createClassLoader("server", commonLoader);
//创建 shared ClassLoader, 父 ClassLoader 为 common
sharedLoader = createClassLoader("shared", commonLoader);
} catch (Throwable t) {
log("Class loader creation threw exception", t);
System.exit(1);
}
}
2.
createClassLoader,负责具体的创建工作
在$CATALINA_HOME/conf/catalina.properties 中定义了 common,
server, shared
ClassLoader 载入类的路径及一些包的安全权限.
//common 载入类的路径
陈国庆(chen77716@hotmail.com) Page 2 5/20/2004
陈国庆(chen77716@hotmail.com) Page 3 5/20/2004
common.loader=${catalina.home}/common/classes,
${catalina.home}/common/endorsed/*.jar,${catalina.home}/common/lib/*.jar
//server 载入类的路径
server.loader=${catalina.home}/server/classes,
${catalina.home}/server/lib/*.jar
//shared 载入类的路径
shared.loader=${catalina.base}/shared/classes,
${catalina.base}/shared/lib/*.jar
/**
*param name:Load Name
*param parent:父 Loader
*classLoader 的资源分三种:
*1.未打包的 classes,一般是一个目录
*2.打包的 jar 目录
*3.网络资源,一般是网上的一个 jar 包 (Applet 经常用到这样的 loader)
*/
private ClassLoader createClassLoader(String name, ClassLoader parent)
throws Exception {
//从 catalina.properties 中取得改 Loader 的配置信息
String value = CatalinaProperties.getProperty(name + ".loader");
if ((value == null) || (value.equals("")))
return parent;
//classes 目录
ArrayList unpackedList = new ArrayList();
//jar 目录
ArrayList packedList = new ArrayList();
//网络路径指定的包
ArrayList urlList = new ArrayList();
StringTokenizer tokenizer = new StringTokenizer(value, ",");
//当前 Loader 该装载的类
while (tokenizer.hasMoreElements()) {
String repository = tokenizer.nextToken();
// Check for a JAR URL repository
try {
//如果是网络路径追加 url
urlList.add(new URL(repository));
continue;
} catch (MalformedURLException e) {
陈国庆(chen77716@hotmail.com) Page 3 5/20/2004
陈国庆(chen77716@hotmail.com) Page 4 5/20/2004
// Ignore
}
// 本地路径
boolean packed = false;
//${catalina.home}
if (repository.startsWith(CATALINA_HOME_TOKEN)) {
repository = getCatalinaHome()
+ repository.substring(CATALINA_HOME_TOKEN.length());
//${catalina.base}
} else if (repository.startsWith(CATALINA_BASE_TOKEN)) {
repository = getCatalinaBase()
+ repository.substring(CATALINA_BASE_TOKEN.length());
}
/**经过上述操作,把 catalina.properties 里的路径替换成绝对路径*/
//如果是 jar 文件路径
if (repository.endsWith("*.jar")) {
packed = true;
repository = repository.substring
(0, repository.length() - "*.jar".length());
}
if (packed) {
packedList.add(new File(repository));
} else {
unpackedList.add(new File(repository));
}
}
File[] unpacked = (File[]) unpackedList.toArray(new File[0]);
File[] packed = (File[]) packedList.toArray(new File[0]);
URL[] urls = (URL[]) urlList.toArray(new URL[0]);
//调用 Factory 的方法创建 ClassLoader
return ClassLoaderFactory.createClassLoader
(unpacked, packed, urls, parent);
}
陈国庆(chen77716@hotmail.com) Page 4 5/20/2004
剩余15页未读,继续阅读
charlesch
- 粉丝: 0
- 资源: 10
上传资源 快速赚钱
- 我的内容管理 收起
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
会员权益专享
最新资源
- zigbee-cluster-library-specification
- JSBSim Reference Manual
- c++校园超市商品信息管理系统课程设计说明书(含源代码) (2).pdf
- 建筑供配电系统相关课件.pptx
- 企业管理规章制度及管理模式.doc
- vb打开摄像头.doc
- 云计算-可信计算中认证协议改进方案.pdf
- [详细完整版]单片机编程4.ppt
- c语言常用算法.pdf
- c++经典程序代码大全.pdf
- 单片机数字时钟资料.doc
- 11项目管理前沿1.0.pptx
- 基于ssm的“魅力”繁峙宣传网站的设计与实现论文.doc
- 智慧交通综合解决方案.pptx
- 建筑防潮设计-PowerPointPresentati.pptx
- SPC统计过程控制程序.pptx
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功