Posted on 2012-02-29 15:32
齐纳尔多 阅读(384)
评论(0) 编辑 收藏 所属分类:
服务器(软件知识)
一、下载tomcat源码, 用的版本是7.0.26,把src下代码copy到eclipse报错,缺少3个jar包
jaxrpc.jar、wsdl4j.jar、org.eclipse.jdt.core_3.5.2.v_981_R35x.jar(从eclipse-plugins下找的)
二、 阅读代码-从入口开始
1、入口类org.apache.catalina.startup.Bootstrap, 找到main函数
2、Bootstrap首先初始化-bootstrap.init()
2.1 setCatalinaHome()
首先获得系统catalina.home属性值,不存在,检查user.dir属性下是否存在bootstrap.jar文件
(i)存在:其实就是设置catalina.home为bin的上一级目录
(ii)不存在:设置catalina.home属性值为user.dir的属性值
2.2 setCatalinaBase()
首先获得系统catalina.base属性值,如果不存在,设置为catalina.home的值
2.3 initClassLoaders()
初始化类加载器,一共3个类加载器ClassLoader commonLoader, catalinaLoader, sharedLoader
2.3.1调用createClassLoader(String name, ClassLoader parent)方法,name:加载器名称标识, parent父加载器
2.3.1.1 CatalinaProperties属性工具类加载属性文件catalina.properties,
默认common.loader=${catalina.base}/lib,${catalina.base}/lib/*.jar,${catalina.home}/lib,${catalina.home}/lib/*.jar
server、shared为空. 然后执行replace(String value)方法, 这个方法作为相当于把其中的占位符${}替换成本地的路径信息,
使用StringBuilder拼装字符串(StringBuilder源码阅读), 使用StringTokenizer分割字符串,然后放到org.org.apache.catalina.
startup.ClassLoaderFactory.Repository 静态内部类的集合(ArrayList)中,
-->Repository持有2个属性:String location(位置信息),RepositoryType type(仓库类型)
-->RepositoryType有4种
1.URL --首先检查是不是URL类型
2.GLOB --以*.jar结尾
3.JAR --以.jar结尾
4.DIR --其余的都归到这个类型下
调用ClassLoaderFactory的静态方法 static ClassLoader createClassLoader(List<Repository> repositories,final ClassLoader parent);
//这边调用一个native本地方法-应该是一个回调之类的东西,不明白,
//其中StandardClassLoader类为@Deprecated, extends URLClassLoader
return AccessController.doPrivileged(
new PrivilegedAction<StandardClassLoader>() {
@Override
public StandardClassLoader run() {
if (parent == null)
return new StandardClassLoader(array);
else
return new StandardClassLoader(array, parent);
}
});
这里认为返回一个类加载器(URLClassLoader), 把Repository集合中的Repository转换成URL资源加载到类加载中。
2.3.2 Jmx注册(JMX入门学习)
2.3.3 最后返回一个类加载器(URLClassLoader)
由于server、shared在catalina.properties默认配置都是空的
catalinaLoader = createClassLoader("server", commonLoader);
sharedLoader = createClassLoader("shared", commonLoader);
所以返回都是它的父加载器,即common对应的加载器