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'
- Maven的pom.xml添加:
如果是模块化项目,补充模块依赖声明
要是你的项目是JDK模块化项目(有module-info.java文件),需要在里面添加对java.sql和MySQL驱动模块的依赖:module 你的模块名 { requires java.sql; requires mysql.connector.java; // MySQL 8.0+驱动的模块名是这个 }
按照上面的步骤来,应该就能解决这个NoClassDefFoundError的问题啦!
备注:内容来源于stack exchange,提问作者user23326446




