一、下載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);












這里認為返回一個類加載器(URLClassLoader), 把Repository集合中的Repository轉換成URL資源加載到類加載中。
2.3.2 Jmx注冊(JMX入門學習)
2.3.3 最后返回一個類加載器(URLClassLoader)
由于server、shared在catalina.properties默認配置都是空的


所以返回都是它的父加載器,即common對應的加載器