升级mysql-connector-java至8.0.31+后出现JDBC驱动找不到问题求助
问题分析与解决
你遇到的报错信息:
java.sql.SQLException: No suitable driver found for jdbc:mysql://feldspar:3306/sndm
本质是JDBC SPI驱动自动加载机制失效,和mysql-connector-java 8.0.31及以上版本的打包特性、maven-shade-plugin的配置有关,并非connector的已知bug,而是配置适配问题。
核心原因
JDBC 4.0+依赖SPI(服务提供者接口)自动加载驱动,要求最终JAR包中存在META-INF/services/java.sql.Driver文件,且文件内容指向驱动类com.mysql.cj.jdbc.Driver。
当你将mysql-connector-java依赖标记为<optional>true</optional>并使用maven-shade-plugin打包时:
- 8.0.30及以下版本:shade插件默认会自动合并该依赖的SPI文件;
- 8.0.31及以上版本:shade插件默认不会处理optional依赖的SPI文件,导致最终JAR中缺失驱动注册信息,DriverManager无法识别JDBC URL对应的驱动。
解决方案
修改maven-shade-plugin的配置,显式添加ServicesResourceTransformer,强制合并所有依赖的SPI服务文件:
<plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-shade-plugin</artifactId> <version>3.4.1</version> <!-- 使用适配Java 11的插件版本 --> <executions> <execution> <phase>package</phase> <goals> <goal>shade</goal> </goals> <configuration> <transformers> <!-- 合并所有依赖的SPI服务注册文件 --> <transformer implementation="org.apache.maven.plugins.shade.resource.ServicesResourceTransformer"/> <!-- 保留原有其他transformer配置(如主类指定等) --> </transformers> </configuration> </execution> </executions> </plugin>
验证步骤
- 重新打包后,检查最终JAR包内是否存在
META-INF/services/java.sql.Driver文件; - 打开该文件,确认内容为
com.mysql.cj.jdbc.Driver; - 运行程序,验证驱动加载正常。
额外提示
如果上述配置未解决问题,可以尝试:
- 移除依赖的
<optional>true</optional>(若你的打包逻辑允许); - 在代码中显式调用
Class.forName("com.mysql.cj.jdbc.Driver")强制加载驱动(不推荐,违背JDBC 4.0+规范,但可作为临时 workaround)。
内容的提问来源于stack exchange,提问作者giles3
相关产品推荐
相关产品推荐

