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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.21 02:02:11