Extension ClassLoader在Java 8及之前加载$JAVA_HOME/jre/lib/ext或java.ext.dirs指定路径的JAR,是URLClassLoader子类、父加载器为Bootstrap ClassLoader,遵循双亲委派;Java 9+已移除,由模块路径和平台模块替代。

Extension ClassLoader(扩展类加载器)在 Java 8 及之前版本中负责加载 $JAVA_HOME/jre/lib/ext 目录下的 JAR 包,或由系统属性 java.ext.dirs 指定的路径中的 JAR 文件。它不参与模块化系统(Java 9+ 的 Module System),在 Java 9 后已被移除,取而代之的是模块路径(--module-path)和平台模块机制。
Extension ClassLoader 加载扩展包的原理
Extension ClassLoader 是 URLClassLoader 的子类,其父加载器是 Bootstrap ClassLoader(启动类加载器)。它在初始化时会读取 java.ext.dirs 属性(默认为 $JAVA_HOME/jre/lib/ext),将该路径下所有以 .jar 或 .zip 结尾的文件构造成 URL 数组,并作为 URLClassLoader 的构造参数传入。后续对类的加载请求(如 loadClass("xxx.Yyy"))会按双亲委派模型先委托给父加载器,失败后再尝试从自己的 URL 路径中查找并加载对应类。
如何让 Extension ClassLoader 加载自定义扩展包
只需将 JAR 包放入扩展目录,或显式修改 java.ext.dirs:
- 把
my-ext.jar复制到$JAVA_HOME/jre/lib/ext/(注意:JDK 9+ 已无此目录,不适用) - 启动 JVM 时指定:
java -Djava.ext.dirs=/path/to/my/ext:/usr/lib/jvm/java-8-openjdk/jre/lib/ext MyApp - 代码中动态设置(不推荐,仅限调试):
System.setProperty("java.ext.dirs", "/my/ext/dir");—— 需在 JVM 启动早期执行,且需配合重启类加载器逻辑,实际极少使用
Java 9+ 中的替代方案
Extension mechanism 已被废弃,现代 Java 推荐以下方式替代:
立即学习“Java免费学习笔记(深入)”;
- 将依赖 JAR 放入应用 classpath(如通过
-cp或构建工具管理) - 使用模块系统:把 JAR 打包为模块(含
module-info.class),用--module-path加载 - 对于需要全局共享的库,可考虑自定义
ClassLoader或使用服务加载机制(ServiceLoader)
注意事项与常见问题
Extension ClassLoader 行为受 JVM 版本严格限制:
- Java 8u202+ 默认禁用 ext 目录加载(可通过
-XX:+UseSpinning等开关恢复,但不建议) - JDK 9 开始彻底删除
lib/ext目录和ExtensionClassLoader类,反射获取会抛NoClassDefFoundError - 扩展包中若含
MANIFEST.MF的Class-Path条目,不会被自动解析——Extension ClassLoader 不支持嵌套 classpath - 安全策略限制:扩展类默认拥有更高权限(如可读写文件系统),因此随意添加 JAR 存在风险


















