You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Spring Boot生成Fat Jar后运行报错:Failed to determine a suitable driver class

问题解决:Spring Boot + Gradle Shadow 打包Fat Jar后无法找到数据库驱动

核心原因分析

本地IDE能正常运行但Fat Jar报错,本质是打包过程破坏了Spring Boot的类加载机制,或数据库驱动未被正确打包进Jar:

  1. 手动配置的jar任务覆盖了Spring Boot默认的启动类配置(Spring Boot实际用JarLauncher作为入口,而非直接指定你的应用类)
  2. Shadow插件未与Spring Boot插件协同处理自动配置所需的元数据文件
  3. 数据库驱动依赖的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检查:provided scope的依赖不会被打包进Jar,必须用implementation或runtimeOnly确保驱动类被包含在Fat Jar中

内容的提问来源于stack exchange,提问作者MohammadReza Safari

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.03 08:42:50