Bootstrap 在启动的时候初始化了三种class loader:common,server和shared。在它的createClassLoader方法里面,通过:
来得到属性文件catalina.properties里面获得他们的配置:
可以看出默认情况下指示对common class loader做了配置,而实际上它也是server和shared的父loader。
经过replace${}变量之后得到:
把他们split成4个repository,尽管有重复,也没有过滤掉。放入:
然后利用工厂来创建:
这个class loader其实是一个URLClassLoader,用来根据URL查找并load类。如果是jar就直接从jar里面找class,如果是dir,就找它下面的jar,然后从jar里面找类。
然后就查找MBServer,这个其实是为管理和监控JVM运行的API。找到后就将这个class loader 注册进去:
因为,server和shared的配置都是空,那么他们的class loader都指向了他们的父loader:common loader。 也就是说默认情况下,这3个loader都是common loader。也就是说tomcat会从output/build/lib下面load 类。
这个目录下面有这些jar:
[img]http://dl.iteye.com/upload/attachment/0066/1561/44c8261a-b008-3add-985f-15d035d5b170.png[/img]
String value = CatalinaProperties.getProperty(name + ".loader");
来得到属性文件catalina.properties里面获得他们的配置:
common.loader=${catalina.base}/lib,${catalina.base}/lib/*.jar,${catalina.home}/lib,${catalina.home}/lib/*.jar
server.loader=
shared.loader=
可以看出默认情况下指示对common class loader做了配置,而实际上它也是server和shared的父loader。
经过replace${}变量之后得到:
C:\cygwin\home\Administrator\tomcat7/output/build/lib,
C:\cygwin\home\Administrator\tomcat7/output/build/lib/*.jar,
C:\cygwin\home\Administrator\tomcat7/output/build/lib,
C:\cygwin\home\Administrator\tomcat7/output/build/lib/*.jar
把他们split成4个repository,尽管有重复,也没有过滤掉。放入:
List<Repository> repositories = new ArrayList<Repository>();
然后利用工厂来创建:
ClassLoader classLoader = ClassLoaderFactory.createClassLoader
(repositories, parent);
这个class loader其实是一个URLClassLoader,用来根据URL查找并load类。如果是jar就直接从jar里面找class,如果是dir,就找它下面的jar,然后从jar里面找类。
然后就查找MBServer,这个其实是为管理和监控JVM运行的API。找到后就将这个class loader 注册进去:
mBeanServer.registerMBean(classLoader, objectName);
因为,server和shared的配置都是空,那么他们的class loader都指向了他们的父loader:common loader。 也就是说默认情况下,这3个loader都是common loader。也就是说tomcat会从output/build/lib下面load 类。
这个目录下面有这些jar:
[img]http://dl.iteye.com/upload/attachment/0066/1561/44c8261a-b008-3add-985f-15d035d5b170.png[/img]