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

升级Android Gradle Plugin 7+后发布Android库SNAPSHOT版本报错如何解决

问题解答

问题本质

这个问题不是Android Gradle Plugin的回归问题,是Gradle 7.0+新增了同项目多出版物坐标冲突校验机制,同时原有发布配置没有适配Nexus仓库版本管控策略共同导致的。

报错原因说明

  • 首次400报错:Nexus快照仓库默认仅允许存放版本号带-SNAPSHOT后缀的构件,你推送的版本1.1.0-M25不带对应后缀,被仓库策略直接拒绝。
  • 二次依赖解析报错:Gradle 7.0+新增校验规则,禁止同一个项目下存在groupId、artifactId完全相同但版本不同的多个出版物,避免跨项目依赖时无法确定构件版本。

可行解决方案(按推荐优先级排序)

方案1:动态适配仓库类型统一设置全局版本

根据传入的仓库地址自动判断是否为快照仓库,统一调整全局项目版本后缀,保证同项目下所有出版物版本一致,不会触发冲突校验。
在模块build.gradle.kts顶部添加如下逻辑:

val isSnapshotRepo = providers.gradleProperty("mavenRepoUrl")
    .orNull?.contains("snapshots", ignoreCase = true) == true
project.version = if (isSnapshotRepo) {
    "${project.version}-SNAPSHOT"
} else {
    project.version
}

原有publication配置无需修改版本字段,直接使用project.version即可。执行发布命令时不需要额外加参数,推送到快照仓的版本会自动加-SNAPSHOT后缀,符合Nexus仓库策略。

方案2:按需创建对应变体的出版物

执行发布命令时指定要发布的变体,仅创建对应变体的出版物,避免同项目下存在多个冲突的出版物。
修改publication配置如下:

val publishVariant = providers.gradleProperty("publishVariant").orNull ?: "Release"
publishing {
    publications {
        if (publishVariant == "Release") {
            create<MavenPublication>("Release") {
                from(components.getByName("release"))
                groupId = project.group as String
                artifactId = "my-android-project-${project.name}"
                version = project.version as String
            }
        }
        if (publishVariant == "Debug") {
            create<MavenPublication>("Debug") {
                from(components.getByName("debug"))
                groupId = project.group as String
                artifactId = "my-android-project-${project.name}"
                version = "${project.version}-SNAPSHOT"
            }
        }
    }
}

发布Debug版本时,在原有命令中添加-PpublishVariant=Debug参数即可,此时项目仅存在Debug一个出版物,不会触发冲突校验。

方案3:区分不同变体的artifactId

给Debug变体的artifactId添加专属后缀,保证和Release变体的Maven坐标完全不同,规避冲突校验。
修改Debug出版物配置如下:

create<MavenPublication>("Debug") {
    from(components.getByName("debug"))
    groupId = project.group as String
    // 给Debug构件添加专属artifactId后缀
    artifactId = "my-android-project-${project.name}-debug"
    version = "${project.version}-SNAPSHOT"
}

该方案适合需要同时对外提供Release和Debug两类构件的场景,缺点是依赖Debug版本时需要单独引用带-debug后缀的artifactId。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.07 02:12:02