1. J2SE标准类加载器
Bootstrap Class Loader
:用于加载JVM提供的基础运行类,即位于%JAVA_HOME%/jre/lib
目录下的核心类库Extension Class Loader
:用于加载除核心类库外的Jar包,只要复制到指定的扩展目录%JAVA_HOME%/jre/lib/ext
下的Jar,JVM就会自动加载System Class Loader
:用于加载应用程序的Jar包及其启动入口
Ps:Endorsed Standards Override Mechanism机制,用于允许替换JCP之外生成的API,通过这个机制,应用程序可以提供新版本的API来覆盖JVM的默认实现,JVM默认的endorsed目录为%JAVA_HOME%lib/endorsed
,只要复制到该路径下的包,都会优先于JVM的类加载
2. Tomcat类加载器
隔离、灵活、性能、共享
- Common类加载器:负责加载Tomcat应用服务器内部和Web应用均可见的类,路径为common.loader,默认指向$CATALINA_HOME/lib下的包
- Catalina类加载器:负责加载只有Tomcat应用服务器内部可见的类,路径为server.loader,默认为空,此时Tomcat使用Common类加器加载应用服务器
- Shared类加载器:加载Web应用共享的类,路径为shared.loader,默认为空,此时Tomcat使用Common类加器加载器作为Web应用的父加载器
Web应用以Shared为父加载器,加载/WEB_INF/classes目录下的未压缩的Class和资源文件以及/WEB_INF/lib目录下的包。
3. Web应用类加载器
默认的类加载机制-委派模式规则如下:
- 从缓存中加载
- 如果缓存中没有,则从父类加载器中加载
- 如果父类加载器没有,则从当前类加载器加载
- 如果没有,则抛出异常
但是Web应用类加载器打破了双亲委派模式。当进行类加载时,除JVM基础类库外,它会首先尝试通过当前类加载器加载,然后才会进行委派。Servlet规范相关API禁止通过Web应用类加载器加载,因此,不要在Web应用中包含这些包。
Web应用类加载器默认加载顺序如下:
- 从缓存中加载
- 如果没有,则从JVM的Bootstrap类加载器加载
- 如果没有,则从当前类加载器加载(/WEB_INF/classes、/WEB_INF/lib的顺序)
- 如果没有,则从父加载器加载,由于父类加载器采用默认的委派模式,加载顺序为System、Common、Shared
Tomcat通过该机制实现为Web应用中的Jar包覆盖服务器提供包的目的。如上所述,Java核心类库、Servlet规范相关的类库是无法覆盖的,此外Java默认提供的诸如XML工具包,由于位于JVM的Bootstrap类加载器也无法覆盖,只能通过endorsed的方式实现。