Tomcat 7 源码分析 - 初始化 class loader

本文深入解析了Tomcat启动时初始化的三种Classloader:common、server和shared,详细阐述了它们的工作原理及配置过程,特别是如何从catalina.properties文件中获取配置信息,并最终创建出URLClassLoader实例,用于加载类。通过分析,揭示了commonloader作为父loader的角色及其对server和sharedloader的影响。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Bootstrap 在启动的时候初始化了三种class loader:common,server和shared。在它的createClassLoader方法里面,通过:
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]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值