tomcat类加载机制
tomcat server在启动的时候将构造一个classloader树,以保证模块的类库是私有的
tomcat server的classloader结构如下:
- bootstrap
- |
- system
- |
- common
- / \
- catalina shared
- / \
- webapp1 webapp2
其中:
- bootstrap - 载入jvm自带的类和$java_home/jre/lib/ext/*.jar
- system - 载入$classpath/*.class
- common - 载入$catalina_home/common/...,它们对tomcat和所有的web app都可见
- catalina - 载入$catalina_home/server/...,它们仅对tomcat可见,对所有的web app都不可见
- shared - 载入$catalina_home/shared/...,它们仅对所有web app可见,对tomcat不可见(也不必见)
- webapp - 载入contextbase?/web-inf/...,它们仅对该web app可见
每个运行中的线程都有一个成员contextclassloader,用来在运行时动态地载入其它类,系统默认的 contextclassloader是systemclassloader,所以一般而言java程序在执行时可以使用jvm自带的类、$ java_home/jre/lib/ext/中的类和$classpath/中的类,可以使用thread.currentthread(). setcontextclassloader(...);更改当前线程的contextclassloader,来改变其载入类的行为
classloader被组织成树形,一般的工作原理是:
1) 线程需要用到某个类,于是contextclassloader被请求来载入该类
2) contextclassloader请求它的父classloader来完成该载入请求
3) 如果父classloader无法载入类,则contextclassloader试图自己来载入
注意:webapp?classloader的工作原理和上述有少许不同:
它先试图自己载入类(在contextbase?/web-inf/...中载入类),如果无法载入,再请求父classloader完成
由此可得:
- 对于web app线程,它的contextclassloader是webapp?classloader
- 对于tomcat server线程,它的contextclassloader是catalinaclassloader
-
相关文章
2秒记住本站域名
玩过泡泡龙吗?Readygo?Go! 再加上.Com.Cn的后缀,那就是大名小顶的ReadyGo.com.cn
