前言
理解Tomcat的类加载机制有助于我们更好的理解容器是如何加载我们的web应用
0x01 类加载机制帮助容器解决了什么问题
问题1:部署在同一个服务器上的两个Web应用程序所使用的Java类库可以实现相互隔离
问题2:部署在同一个服务器上的两个Web应用程序所使用的Java类库可以共享
问题3:服务器需要尽可能保证自身安全不受部署的Web应用程序影响
服务器本身依赖的类库应该与应用程序依赖类库隔离
问题4:支持JSP应用的Web服务器,大多数需要支持HotSwap功能
JSP文件最终编译为Class文件才能由虚拟机执行,且修改概率高,需要修改后无需重启服务器、
0x02 Tomcat如何规划用户类库和类加载器
Tomcat中有四组可以存放Java类库的地方
/common/*
- 类库可被Tomcat和所有Web应用程序共同使用
CommonClassLoader
加载器作为ApplicationClassLoader
的子加载器
/server/*
- 类库可被Tomcat使用,对所有Web应用程序不可见
CatalinaClassLoader
加载器作为CommonClassLoader
的子加载器
/shared/*
- 类库可被所有Web应用程序使用,但对Tomcat自己不可见
SharedClassLoader
作为CommonClassLoader
的子加载器
/WEB-INF/*
- 类库仅仅可以被Web应用程序使用,对Tomcat和其他Web应用程序不可见
WebAppClassLoader
作为SharedClassLoader
的子加载器- 每个Web应用对应一个
WebAppClassLoader
- 每个
WebAppClassLoader
都有一个子加载器JspClassLoader
0x03 类加载器讲解
JspClassLoader
- 当服务器发现jsp文件被修改
- 替换掉当前的JspClassLoader的实例
- 再新建一个JspClassLoader的实例来完成HotSwap功能
0x04 注意事项
Tomcat6.x默认都是common类加载器
Tomcat6.x中只有指定了tomcat/conf/catalina.properties
文件中的server.loader
和share.loader
才会启用这两个类加载器,默认采用common
类处理器处理全部