服务热线:13616026886

技术文档 欢迎使用技术文档,我们为你提供从新手到专业开发者的所有资源,你也可以通过它日益精进

位置:首页 > 技术文档 > JAVA > 新手入门 > 基础入门 > 查看文档

tomcat类加载机制

    tomcat server在启动的时候将构造一个classloader树,以保证模块的类库是私有的
    tomcat server的classloader结构如下:

代码
  1.     bootstrap  
  2.           |            
  3.     system   
  4.           |  
  5.     common  
  6.      /             /  
  7. catalina  shared  
  8.                       /    /  
  9.        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

 

扫描关注微信公众号