为何自定义类加载器在Java17中抛出java.sql.Driver找不到异常?
Java 8与Java 17中URLClassLoader加载
java.sql.Driver的差异 运行现象对比
Java 8 执行正常
以下代码在Java 8环境中可正常运行:
public class Test { public static void main(String[] args) throws Exception { URLClassLoader loader = new URLClassLoader(new URL[0], null); System.out.println("" + loader.loadClass("java.sql.Driver")); } }
Java 17 抛出异常
在Java 17环境中运行上述代码,会抛出ClassNotFoundException异常:
Exception in thread "main" java.lang.ClassNotFoundException: java.sql.Driver at java.base/java.net.URLClassLoader.findClass(URLClassLoader.java:445) at java.base/java.lang.ClassLoader.loadClass(ClassLoader.java:592) at java.base/java.lang.ClassLoader.loadClass(ClassLoader.java:525) at Test.main(Test.java:16)
原因分析
Java 9及后续版本引入了模块化系统(Module System),类加载机制发生根本性调整:
- 系统类被划分到不同模块中(如
java.sql.Driver属于java.sql模块,依赖java.base核心模块) - 自定义类加载器如果未指定父加载器(示例中传入
null作为父加载器),无法访问平台类加载器负责加载的系统模块类,模块的可见性规则限制了跨加载器的类访问。
相关同类问题
- NextGen Healthcare Connect项目中的类加载相关讨论与问题
- Stack Overflow上关于
java.lang.NoClassDefFoundError: java/sql/Driver的问题 - kscript项目中涉及URLClassLoader的兼容性问题
内容的提问来源于stack exchange,提问作者Reto Höhener
相关产品推荐
相关产品推荐

