1. J2SE标准类加载器

image-20250831094759465

  • 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类加载器

隔离、灵活、性能、共享

image-20250831095553197

  • 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的方式实现。


本站由 卡卡龙 使用 Stellar 1.29.1主题创建

本站访问量 次. 本文阅读量 次.