目录
一、类加载器的创建
在之前的Tomcat启动源码中,简单的介绍了Tomcat的四种类加载器,再复习一遍。
类加载器的结构层次:
commonLoader、catalinaLoader、sharedLoader可以在tomcat下的conf/catalina.properties文件中修改。
在Tomcat的启动中,一开始就创建了commonLoader、catalinaLoader、sharedLoader类加载器并且加载对应设置的资源。
Bootstrap:
private void initClassLoaders() {
try {
//读取catalina.properties下的common.loader资源加载
//commonLoader的父类加载器是应用类加载器(不设置都默认为应用类加载器)
commonLoader = createClassLoader("common", null);
if( commonLoader == null ) {
commonLoader=this.getClass().getClassLoader();
}
//读取catalina.properties下的server.loader资源加载
//catalinaLoader的父类加载器是commonLoader
catalinaLoader = createClassLoader("server", commonLoader);
//读取catalina.properties下的shard.loader资源加载
//sharedLoader的父类加载器是commonLoader
sharedLoader = createClassLoader("shared", commonLoader);
} catch (Throwable t) {
handleThrowable(t);
log.error("Class loader creation threw exception", t);
System.exit(1);
}
}
private ClassLoader createClassLoader(String name, ClassLoader parent)
throws Exception {
//读取catalina.properties中对应的key值
String value = CatalinaProperties.getProperty(name + ".loader");
//如果没有设值对应的属性值,则返回父类加载器
if ((value == null) || (value.equals("")))
return parent;
//替换掉Tomact的表达式变量值,如catalina.home、catalina.base等为具体的路径
value = replace(value);
List<Repository> repositories = new ArrayList<Repository>();
StringTokenizer tokenizer = new StringTokenizer(value, ",");
while (tokenizer.hasMoreElements()) {
String repository = tokenizer.nextToken().trim();
if (repository.length() == 0) {
continue;
}
try {
//创建一个URL
@SuppressWarnings("unused")
U