Spring Boot生成Fat Jar后运行报错:Failed to determine a suitable driver class
问题解决:Spring Boot + Gradle Shadow 打包Fat Jar后无法找到数据库驱动
核心原因分析
本地IDE能正常运行但Fat Jar报错,本质是打包过程破坏了Spring Boot的类加载机制,或数据库驱动未被正确打包进Jar:
- 手动配置的
jar任务覆盖了Spring Boot默认的启动类配置(Spring Boot实际用JarLauncher作为入口,而非直接指定你的应用类) - Shadow插件未与Spring Boot插件协同处理自动配置所需的元数据文件
- 数据库驱动依赖的
scope可能被设为provided,导致未被打包进Fat Jar
解决方案步骤
1. 修正build.gradle配置(移除冲突配置,协同Shadow与Spring Boot)
删除原有的jar任务和自定义customFatJar任务,替换为以下配置:
plugins { id 'com.github.johnrengelman.shadow' version '8.1.1' id 'java' id 'org.springframework.boot' version '3.2.0' id 'io.spring.dependency-management' version '1.1.4' } // 配置Shadow插件兼容Spring Boot shadowJar { // 指定应用主类(可省略,Spring Boot插件会自动传递) mainClass = 'com.security.login.LoginApplication' // 合并Spring Boot自动配置所需的META-INF/services文件 mergeServiceFiles() // 处理重复类:Spring Boot依赖中存在重复元数据,选择保留而非排除 duplicatesStrategy = DuplicatesStrategy.INCLUDE // 打包所有运行时依赖 configurations = [project.configurations.runtimeClasspath] } // 确保Shadow任务依赖Spring Boot的bootJar,继承其打包逻辑 shadowJar.dependsOn bootJar // 可选:将shadowJar设为build任务的默认目标 tasks.named('build').configure { dependsOn shadowJar } dependencies { implementation 'org.springframework.boot:spring-boot-starter-web' implementation 'org.springframework.boot:spring-boot-starter-data-jpa' // 数据库驱动必须用implementation/runtimeOnly,禁止用provided runtimeOnly 'com.mysql:mysql-connector-j:8.0.33' // 其他业务依赖... }
2. 重新打包并运行
执行打包命令:
./gradlew clean shadowJar
运行生成的Fat Jar:
java -jar build/libs/authentication-0.0.1-SNAPSHOT-all.jar
备选方案:直接使用Spring Boot官方打包(无需Shadow插件)
如果没有特殊的Jar合并需求,Spring Boot自带的bootJar任务更简单可靠:
bootJar { // 可选:给生成的Jar加后缀区分默认Jar archiveClassifier = 'exec' }
打包并运行:
./gradlew clean bootJar java -jar build/libs/authentication-0.0.1-SNAPSHOT-exec.jar
关键细节说明
- 禁止手动配置Main-Class:Spring Boot通过
JarLauncher实现类加载,手动指定应用类会跳过其类加载逻辑,导致依赖无法被正确加载 - mergeServiceFiles必须开启:Spring Boot的自动配置依赖
META-INF/services下的配置文件,Shadow默认不会合并这些文件,会导致数据源驱动无法被自动识别 - 驱动依赖scope检查:
providedscope的依赖不会被打包进Jar,必须用implementation或runtimeOnly确保驱动类被包含在Fat Jar中
内容的提问来源于stack exchange,提问作者MohammadReza Safari
相关产品推荐
相关产品推荐

