Gradle构建Jar发布Nexus报错:相同扩展名与分类器重复工件
发布Jar至Nexus时出现重复工件错误
我使用以下build.gradle配置构建名为app.jar的Jar包:
jar{ from{ configurations.runtimeClasspath.collect {it.isDirectory() ? it : zipTree(it)} } } jar { archiveFileName = 'app.jar' } jar{ duplicatesStrategy = 'exclude' }
Jar包创建成功,但发布至Nexus时触发如下报错:
Execution failed for task ':publishMavenPublicationToMavenRepository'. > Failed to publish publication 'maven' to repository 'maven' > Invalid publication 'maven': multiple artifacts with the identical extension and classifier ('jar', 'null').
我检查build/libs目录仅存在app.jar,无重复工件,恳请解决指引。
问题根源
你分散的jar任务配置会被Gradle合并,但核心冲突在于:当你通过from configurations.runtimeClasspath把依赖打包成Fat Jar后,默认的maven publication会同时识别到原始Jar任务的逻辑产物和自定义Fat Jar产物,导致发布时判定存在重复的Jar工件(尽管本地目录只有一个物理文件)。
解决方案
方案1:合并Jar配置并明确指定发布工件
将分散的jar配置合并为单个代码块,同时在发布配置中明确指定要发布的Jar:
// 合并Jar任务配置 jar { from { configurations.runtimeClasspath.collect { it.isDirectory() ? it : zipTree(it) } } archiveFileName = 'app.jar' duplicatesStrategy = 'exclude' } publishing { publications { maven(MavenPublication) { artifact jar // 明确指定发布该Jar } } repositories { // 配置你的Nexus仓库信息 maven { url = uri("你的Nexus仓库地址") credentials { username = "你的用户名" password = "你的密码" } } } }
方案2:禁用默认组件发布
如果项目是Java应用,maven-publish插件默认会发布components.java组件(包含默认Jar等产物),此时需替换为指定自定义Jar:
publishing { publications { maven(MavenPublication) { // 不要使用默认的components.java,直接指定自定义Jar artifact jar } } }
验证步骤
先执行./gradlew publishToMavenLocal发布到本地Maven仓库,检查~/.m2/repository对应目录下仅生成一个app.jar,确认无重复后再执行发布到Nexus的任务。
内容的提问来源于stack exchange,提问作者Sankar
相关产品推荐
相关产品推荐

