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

Gradle引入Fat Jar后命令行构建报错:Spring类缺失求助

解决Spring Boot Fat Jar作为Gradle依赖时的类缺失问题

这个问题其实挺常见的——Spring Boot的Fat Jar设计初衷是直接运行,而非作为依赖被其他项目引入。虽然它把所有依赖都打包到了BOOT-INF/lib目录下,但Gradle解析依赖时,只会读取Jar对应的pom.xml文件来获取传递依赖,不会扫描Fat Jar内部的嵌套Jar。所以你的第二个项目完全不知道需要引入Spring Boot相关依赖,自然会报类找不到的错误。

下面是两种可行的解决方案,优先推荐第一种:

方案一:发布普通Jar而非Fat Jar作为依赖

在你的Spring Boot项目(rules-base)中,同时生成用于运行的Fat Jar和用于依赖的普通Jar,再把普通Jar发布到仓库(本地或远程)。

修改rules-base项目的build.gradle:

plugins {
    id 'org.springframework.boot' version 'x.x.x' // 替换成你的Spring Boot实际版本
    id 'java'
    id 'maven-publish' // 用于发布Jar到仓库
}

// 启用普通Jar生成任务,和bootJar区分开
jar {
    enabled = true
    // 可选:给普通Jar加个classifier,避免和bootJar重名冲突
    archiveClassifier.set('plain')
}

// 配置发布内容,发布普通Jar及其对应的pom文件
publishing {
    publications {
        mavenJava(MavenPublication) {
            from components.java
            // 如果设置了classifier,这里对应指定
            artifact jar {
                classifier 'plain'
            }
        }
    }
    repositories {
        // 先发布到本地Maven仓库测试
        mavenLocal()
        // 也可以配置远程仓库(比如Nexus),按需开启
        // maven {
        //     url = uri('https://your-nexus-url/repository/maven-snapshots/')
        //     credentials {
        //         username = project.findProperty('nexusUsername') ?: System.getenv('NEXUS_USERNAME')
        //         password = project.findProperty('nexusPassword') ?: System.getenv('NEXUS_PASSWORD')
        //     }
        // }
    }
}

执行gradle publish把普通Jar发布到本地仓库后,在第二个项目中修改依赖引用,指定普通Jar的classifier:

implementation(group: 'com.rules.base', name: 'rules-base', version: '2.0.0-SNAPSHOT', classifier: 'plain')

这样Gradle会自动读取普通Jar对应的pom文件,下载所有Spring Boot相关的传递依赖,类找不到的问题就解决了。

方案二:手动添加依赖(仅临时应急用)

如果暂时无法修改rules-base项目的发布方式,你可以在第二个项目中手动添加所有Spring Boot依赖,同时把Fat Jar作为文件依赖引入:

// 引入Fat Jar文件
implementation files('path/to/rules-base-2.0.0-SNAPSHOT.jar')

// 手动添加Spring Boot依赖,版本要和rules-base里的完全一致
implementation 'org.springframework.boot:spring-boot-starter:x.x.x'
implementation 'org.springframework.boot:spring-boot-starter-web:x.x.x'
// 其他你需要的Spring Boot依赖...

这种方法的缺点很明显:你需要手动同步两个项目的依赖版本,一旦rules-base升级依赖,第二个项目也要跟着修改,维护成本极高,只适合临时应急场景。

总结一下,永远不要把Fat Jar作为依赖引入其他项目,它的定位是可执行包,而普通Jar加pom才是正确的依赖交付方式。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.15 08:03:14