Gradle ShadowJar未打包其中一个内部依赖问题排查
问题分析与解决方案
你的核心问题是Gradle的runtimeClasspath配置未解析到com.idsk.lib.client:lib:0.0.1-SNAPSHOT依赖,因此ShadowJar无法将其打包进胖JAR。以下是可能的原因和对应的解决步骤:
可能的原因
- 依赖仓库未配置快照源:
com.idsk.lib.client的快照包所在仓库未被Gradle识别,或仓库未开启快照支持 - 依赖被意外排除:项目中存在全局或局部的依赖排除规则,移除了
com.idsk.lib.client - 依赖构件异常:
com.idsk.lib.client:lib:0.0.1-SNAPSHOT的构件类型错误(比如是pom而非jar),或其POM中声明了provided等非runtime范围 - 依赖未实际发布:该快照包并未上传到仓库,本地仓库也不存在对应的构件
解决步骤
1. 检查并完善仓库配置
确保Gradle能访问到包含com.idsk.lib.client快照包的仓库,尤其是开启快照支持:
repositories { mavenCentral() mavenLocal() // 替换为你的内部快照仓库地址 maven { url "https://your-internal-repo/snapshots" mavenContent { snapshotsOnly() // 仅拉取快照包 } // 如果仓库是HTTP协议,需要添加以下配置(Gradle 7+默认禁用HTTP) allowInsecureProtocol = true } }
2. 排查依赖排除规则
执行以下命令查看runtimeClasspath的完整依赖树,确认是否有排除com.idsk.lib.client的规则:
./gradlew dependencies --configuration runtimeClasspath
如果发现排除规则,找到对应代码(比如configurations.all { exclude ... }或依赖声明中的exclude)并移除。
3. 验证依赖构件的可用性
- 检查本地Maven仓库(默认路径
~/.m2/repository/com/idsk/lib/client/0.0.1-SNAPSHOT)是否存在对应的jar文件 - 如果本地没有,手动触发依赖拉取:
./gradlew build --refresh-dependencies
4. 调整ShadowJar的配置(可选)
尝试使用Shadow插件自带的shadowRuntimeClasspath配置替代原生的runtimeClasspath,该配置会自动包含Shadow插件所需的所有依赖:
tasks.named<ShadowJar>("shadowJar") { // 替换为shadowRuntimeClasspath configurations = listOf(project.configurations.shadowRuntimeClasspath.get()) // 其余配置保持不变 destinationDirectory.set(File("${project.projectDir}/artifacts")) archiveClassifier.set("") isZip64 = true duplicatesStrategy = DuplicatesStrategy.EXCLUDE mergeServiceFiles() manifest { attributes(mapOf("Main-Class" to "com.interviewdesk.service.assessmentsessionv2.Application")) } exclude("META-INF/*.SF", "META-INF/*.DSA", "META-INF/*.RSA") exclude("**/Log4j2Plugins.dat") }
5. 检查依赖的POM文件
如果是内部开发的依赖,确认com.idsk.lib.client:lib的POM文件:
packaging字段是否为jar- 没有错误的
scope声明(比如provided或test) - 依赖本身没有缺失必要的构件
内容的提问来源于stack exchange,提问作者Vishnuvarthan K
相关产品推荐
相关产品推荐

