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

