扩展类加载器(extension classloader)由sun.misc.launcher$extclassloader实现,负责自动加载$java_home/jre/lib/ext或java.ext.dirs指定路径下的扩展jar包,其父加载器为bootstrap classloader;jdk 9起该机制被模块系统取代。

扩展类加载器(Extension ClassLoader)负责加载 Java 平台的扩展类库,它由 Java 编写,对应类为 sun.misc.Launcher$ExtClassLoader。它的核心作用是加载位于特定目录下的 JAR 包,无需用户显式配置 classpath,属于 JVM 自动识别的“标准扩展机制”。
扩展类加载器的默认加载路径
它会自动扫描并加载以下路径中的 JAR 文件(路径由系统属性 java.ext.dirs 指定):
-
$JAVA_HOME/jre/lib/ext(JDK 8 及以前主流路径) - 或由
-Djava.ext.dirs=...启动参数自定义的目录
只要把 JAR 包放到这些目录下,JVM 启动时扩展类加载器就会自动将其加载进运行时环境,里面的 public 类可被应用程序直接使用(例如 javax.* 开头的类)。
扩展类加载器如何工作
它不依赖 classpath,也不需要 Class.forName() 或 ClassLoader.getSystemClassLoader() 显式触发。其行为发生在 JVM 初始化阶段:
- JVM 启动后,先由启动类加载器加载核心类(
rt.jar等) - 接着扩展类加载器扫描
java.ext.dirs下所有 JAR,逐个解析、验证、准备、初始化其中的类 - 加载成功后,这些类对应用类加载器及其子类加载器可见(遵循双亲委派)
手动验证扩展类加载器是否加载了某个包
可以检查类的加载器来源:
ClassLoader cl = javax.xml.parsers.DocumentBuilder.class.getClassLoader(); System.out.println(cl); // 输出类似:sun.misc.Launcher$ExtClassLoader@xxxx
注意:扩展类加载器的父加载器是启动类加载器(Bootstrap),但 Java 中无法获取到 Bootstrap ClassLoader 实例(返回 null)。
注意事项与替代方案
从 JDK 9 开始,lib/ext 机制已被模块系统(JPMS)取代,java.ext.dirs 不再生效;JDK 17+ 完全移除了该机制。现代项目应改用:
- 模块路径(
--module-path)配合module-info.java - 构建工具(Maven/Gradle)管理依赖
- 运行时通过
URLClassLoader动态加载外部 JAR(需自行控制生命周期)











