You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多
文档控制台
免费开始使用

JDK 17中解决Java数据库连接问题:处理java.lang.NoClassDefFoundError: java/sql/Driver异常

JDK 17中解决Java数据库连接问题:处理java.lang.NoClassDefFoundError: java/sql/Driver异常

嘿,我来帮你搞定这个问题!先看看你贴的这段代码:

public class DEMO {

public static void main(String[] args) {

try {

Class.forName("com.mysql.cj.jdbc.Driver");

}

catch(Exception e) {

System.out.println(e);

}

}

}

运行后出现了这个错误:

Exception in thread "main" java.lang.NoClassDefFoundError: java/sql/Driver

这个问题在JDK 17里出现,主要和JDK的模块化系统以及JDBC驱动加载机制有关,咱们一步步来解决:

先搞懂错误原因

JDK 9之后引入了模块化系统,java.sql虽然是Java的核心模块,但如果你的项目是模块化项目,或者驱动依赖没配好,就可能出现找不到java.sql.Driver的情况。另外,从JDK 6开始,其实已经不需要手动调用Class.forName来加载JDBC驱动了——JDBC 4.0规范支持通过SPI(服务提供者接口)自动加载驱动,手动加载反而可能因为模块依赖问题报错。

具体解决方案

  • 移除不必要的手动驱动加载代码
    删掉Class.forName("com.mysql.cj.jdbc.Driver")这行,直接写数据库连接逻辑就行,修改后的代码示例:

    import java.sql.Connection;
    import java.sql.DriverManager;
    import java.sql.SQLException;
    
    public class DEMO {
        public static void main(String[] args) {
            try {
                // 替换成你的数据库信息
                String dbUrl = "jdbc:mysql://localhost:3306/你的数据库名?useSSL=false&serverTimezone=UTC";
                String dbUser = "你的用户名";
                String dbPassword = "你的密码";
                
                Connection connection = DriverManager.getConnection(dbUrl, dbUser, dbPassword);
                System.out.println("数据库连接成功啦!");
                
                // 用完记得关闭连接
                connection.close();
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }
    }
    
  • 确保MySQL驱动依赖正确引入
    不管你用Maven还是Gradle,都要确保引入了适配JDK 17的MySQL驱动版本(建议用8.0.x系列,比如8.0.33):

    • Maven的pom.xml添加:
      <dependency>
          <groupId>mysql</groupId>
          <artifactId>mysql-connector-java</artifactId>
          <version>8.0.33</version>
      </dependency>
      
    • Gradle的build.gradle添加:
      implementation 'mysql:mysql-connector-java:8.0.33'
      
  • 如果是模块化项目,补充模块依赖声明
    要是你的项目是JDK模块化项目(有module-info.java文件),需要在里面添加对java.sql和MySQL驱动模块的依赖:

    module 你的模块名 {
        requires java.sql;
        requires mysql.connector.java; // MySQL 8.0+驱动的模块名是这个
    }
    

按照上面的步骤来,应该就能解决这个NoClassDefFoundError的问题啦!

备注:内容来源于stack exchange,提问作者user23326446

火山引擎 最新活动