ReadyGo!技术成就梦想 >> JAVA技术 >> 开源技术 >> tomcat类加载机制

tomcat类加载机制

ReadyGo!技术成就梦想 www.efish.cn efish 2007-10-9 14:43:15

    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

 
相关文章
判断java_home友好提示用户 javalauncherbat.zip 4kb 这个脚本执行后判断 java_home 是不是有效, 如果找不到的话就打开帮助页面指..
如何同时启动多个tomcat服务器 前些时日,出于某种需要,需要同时启动多个tomcat服务器,在网上查了半天,才找到解决的办法,拿出来分享一..
tomcat深入??内部结构描述 tomcat服务器是一种servlet/jsp容器,更实质性的说是servlet容器,因为jsp最终还是被编译成servlet来执行的..
开源技术:tomcat5.0下配置ssl 1、使用java1.4版本 2、设置环境变量: path=/usr/j2sdk1.4.1/bin java_home=/usr/j2sdk1.4.1/ classpath=/..
开源技术基础:tomcat的用法 谨以此文送给所有正在使用tomcat或者打算使用的人们,向tomcat的所有开发人员致敬! 一、小猫tomcat其实很可..
tomcat5.5数据库连接池配置 猫咪正不断把自己blog上发表的文章转移到这里,给自己的blog打打知名度,提高点人气。希望大家多访问猫咪的..
2秒记住本站域名

玩过泡泡龙吗?Readygo?Go! 再加上.Com.Cn的后缀,那就是大名小顶的ReadyGo.com.cn

分类导航
ReadyGo!技术成就梦想