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
相关产品推荐
相关产品推荐

