Java程序连接MySQL数据库时出现ClassNotFoundException报错求助
Java连接MySQL时ClassNotFoundException问题解决
错误信息(中文翻译)
Exception in thread "main" java.lang.NoClassDefFoundError: java/sql/Driver 在 java.base/java.lang.ClassLoader.defineClass1(本地方法) 在 java.base/java.lang.ClassLoader.defineClass(ClassLoader.java:1017) 在 java.base/java.security.SecureClassLoader.defineClass(SecureClassLoader.java:150) 在 java.base/jdk.internal.loader.BuiltinClassLoader.defineClass(BuiltinClassLoader.java:862) 在 java.base/jdk.internal.loader.BuiltinClassLoader.findClassOnClassPathOrNull(BuiltinClassLoader.java:760) 在 java.base/jdk.internal.loader.BuiltinClassLoader.loadClassOrNull(BuiltinClassLoader.java:681) 在 java.base/jdk.internal.loader.BuiltinClassLoader.loadClass(BuiltinClassLoader.java:639) 在 java.base/jdk.internal.loader.ClassLoaders$AppClassLoader.loadClass(ClassLoaders.java:188) 在 java.base/java.lang.ClassLoader.loadClass(ClassLoader.java:525) 在 java.base/java.lang.Class.forName0(本地方法) 在 java.base/java.lang.Class.forName(Class.java:375) 在 hello/hello.world.main(world.java:8) 引起原因: java.lang.ClassNotFoundException: java.sql.Driver 在 java.base/jdk.internal.loader.BuiltinClassLoader.loadClass(BuiltinClassLoader.java:641) 在 java.base/jdk.internal.loader.ClassLoaders$AppClassLoader.loadClass(ClassLoaders.java:188) 在 java.base/java.lang.ClassLoader.loadClass(ClassLoader.java:525) ... 12 个更多异常
核心原因
JVM无法找到JDBC相关类或MySQL驱动类,常见触发场景:
- 未引入对应版本的MySQL JDBC驱动包
- JDK9+模块化环境下,未显式声明对
java.sql或MySQL驱动模块的依赖
解决步骤
1. 引入MySQL JDBC驱动包
- 普通Java项目:下载与MySQL版本匹配的驱动包(如
mysql-connector-java-8.0.xx.jar),放入项目lib目录,在IDE中右键添加为库依赖。 - Maven项目:在
pom.xml中添加依赖(版本号根据你的MySQL版本调整):
<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'
2. 适配JDK9+模块化环境
如果项目使用模块化(存在module-info.java),需在其中声明依赖:
module hello { requires java.sql; requires mysql.connector.java; }
非模块化项目可在JVM启动时添加参数:
--add-modules java.sql,mysql.connector.java
3. 修正驱动加载代码
MySQL 8.0+的驱动类名为com.mysql.cj.jdbc.Driver,且JDK6及以上无需手动调用Class.forName()加载驱动(JDBC会自动通过SPI机制加载)。若代码中仍使用旧驱动类名com.mysql.jdbc.Driver,建议替换为新类名,并确保驱动包版本与MySQL服务器版本兼容。
内容的提问来源于stack exchange,提问作者samadhan patil
相关产品推荐
相关产品推荐

