You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

为何自定义类加载器在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.20 16:24:54