Tomcat的类加载器
来源:互联网 发布:xbox360 知乎 编辑:程序博客网 时间:2024/06/16 11:07
Tomcat拥有不同的自定义类加载器,以实现对各种资源库的控制。一般来说,Tomcat主要用类加载器解决以下4个问题。
同一个Web服务器里,各个Web项目之间各自使用的Java类库要互相隔离。
同一个Web服务器里,各个Web项目之间可以提供共享的Java类库。
为了使服务器不受Web项目的影响,应该使服务器的类库与应用程序的类库互相 独立。
对于支持JSP的Web服务器,应该支持热插拔(HotSwap)功能。
对于以上几个问题,如果单独使用一个类加载器明显是达不到效果的,必须根据具体情况使用若干个自定义类加载器。
下面看看Tomcat的类加载器是怎样定义的。如图所示,启动类加载器、扩展类加载器、应用程序类加载器这三个类加载器属于JDK级别的加载器,它们是唯一的,我们一般不会对其做任何更改。
接下来,则是Tomcat的类加载器,在Tomcat中,最重要的一个类加载器是Common类加载器,它的父类加载器是应用程序类加载器,负责加载 $CATALINA_ BASE/lib、$CATALINA_HOME/lib两个目录下所有的.class文件与.jar文件。而下面虚线框的两个类加载器主要用在Tomcat 5版本中,Tomcat 5版本中这两个类加载器实例默认与常见类加载器实例不同,Common类加载器是它们的父类加载器。而在Tomcat 7版本中,这两个实例变量也存在,只是catalina.properties配置文件没有对server.loader和share.loader两项进行配置,所以在程序里这两个类加载器实例就被赋值为Common类加载器实例,即一个Tomcat 7版本的实例其实就只有Common类加载器实例。
下面再看看Tomcat 7版本中对这些类加载器处理的代码。
private void initClassLoaders() {
try {
commonLoader = createClassLoader("common", null);
if( commonLoader == null ) {
commonLoader=this.getClass().getClassLoader();
}
catalinaLoader = createClassLoader("server", commonLoader);
sharedLoader = createClassLoader("shared", commonLoader);
} catch (Throwable t) {
handleThrowable(t);
log.error("Class loader creation threw exception", t);
System.exit(1);
}
}
首先创建一个Common类加载器,再把Common类加载器作为参数传进createClassLoader方法里,在这个方法里面会根据catalina.properties中的server.loader和share.loader属性是否为空判断是否另外创建新的类加载器。如果属性为空,则把常见类加载器直接赋值给Catalina类加载器和共享类加载器。如果默认配置满足不了你的需求,可以通过修改catalina.properties配置文件满足需要。
从图中的WebApp ClassLoader来看,就大概知道它主要用于加载Web应用程序。它的父类加载器是Common类加载器,Tomcat中一般会有多个WebApp类加载器实例,每个类加载器负责加载一个Web程序。
对照这样的一个类加载器结构,看看上面需要解决的问题是否解决。由于每个Web应用项目都有自己的WebApp类加载器,很好地使多个Web应用程序之间互相隔离且能通过创建新的WebApp类加载器达到热部署。这种类加载器结构能有效使Tomcat不受Web应用程序影响,而Common类加载器的存在使多个Web应用程序能够互相共享类库。
========广告时间========
公众号的菜单已分为“分布式”、“机器学习”、“深度学习”、“NLP”、“Java深度”、“Java并发核心”、“JDK源码”、“Tomcat内核”等,可能有一款适合你的胃口。
鄙人的新书《Tomcat内核设计剖析》已经在京东销售了,有需要的朋友可以到 https://item.jd.com/12185360.html 购买。感谢各位朋友。
为什么写《Tomcat内核设计剖析》
=========================
- Tomcat的类加载器
- Tomcat的类加载器
- Tomcat的类加载器
- Tomcat的类加载器
- Tomcat的类加载
- Tomcat涉及的类加载器结构
- Tomcat正统的类加载器架构
- 【JVM】Tomcat的类加载器架构
- Tomcat类加载器
- tomcat类加载器
- tomcat类加载器
- Tomcat内核之Tomcat的类加载器
- Tomcat内核之Tomcat的类加载器
- tomcat类加载器的层次及加载路径
- tomcat加载类的顺序
- tomcat加载类的顺序
- tomcat的类加载机制
- tomcat加载类的顺序
- Unity3d Dotween插件的简单介绍及示例代码
- 网络通信
- HTTP协议_状态码和请求方法
- FRAMEWORK 添加新的接口
- CSS实现单行、多行文本溢出显示省略号(…)
- Tomcat的类加载器
- CodeForces 893A Chess For Three
- X君和T君关于通用学习机的对话
- Lintcode163 Unique Binary Search Trees solution 题解
- Unity3D默认的快捷键
- 数组、链表、堆栈、队列和树
- 关于win7电脑使用ARCGIS9.3时的问题
- 总结函数声明提升,闭包,作用域,this
- 1039. 到底买不买(20)