maven-publish发布至Sonatype生成多个无法关闭的暂存仓库问题
多publication上传Maven Central生成多个分散暂存仓库修复方案
问题表现
- 多平台类库配置多publication后,通过maven-publish插件执行上传操作,Sonatype侧生成多个独立暂存仓库,每个仓库仅存储部分待发布组件
- 单个暂存仓库缺失发布校验要求的必要文件(签名文件、pom、javadoc包等),无法触发仓库关闭操作,整个发布流程卡住
- 本地环境、CI流水线环境均可稳定复现该问题,且所有上传请求的用户ID、出口IP、User Agent参数完全一致,和官方同参数组合仅生成一个暂存仓库的规则不符
排查修复步骤
1. 补全nexus-publish插件的暂存仓库复用配置
这是Kotlin多平台项目发布最容易踩的坑:默认配置下maven-publish会为每个publication独立发起上传会话,如果没有显式指定所有publication复用同一个预创建的暂存仓库,就会触发Sonatype多次创建新仓库。
在发布脚本中补充如下配置:
nexusPublishing { repositories { sonatype { username.set(ossrhUsername) password.set(ossrhPassword) // 替换为自己项目对应的staging profile id,避免自动匹配偏差 stagingProfileId.set("你的项目stagingProfileId") } } // 配置状态轮询参数,避免上传过程中因状态同步延迟触发新仓库创建 transitionCheckOptions { maxRetries.set(60) delayBetween.set(java.time.Duration.ofSeconds(5)) } }
注意:所有publication必须指向同一个Sonatype上传端点,不要为不同平台的publication单独配置仓库地址。
2. 强制调整任务执行顺序
如果没有显式配置任务依赖,Gradle可能在暂存仓库初始化任务完成前,就启动部分publication的上传流程,触发Sonatype自动创建新的暂存仓库。
在构建脚本中添加如下规则,强制所有上传任务依赖暂存仓库初始化任务、签名任务:
tasks.withType<PublishToMavenRepository>().configureEach { // 所有上传任务必须等暂存仓库初始化完成再执行 dependsOn(tasks.named("initializeSonatypeStagingRepository")) // 所有上传任务必须等所有签名文件生成完成再执行 dependsOn(tasks.withType<Sign>()) }
注意:验证阶段执行发布命令时不要加--parallel并行参数,先串行跑通全流程,确认单仓库生成后再根据需要调整并行策略。
3. 修正CI流水线的执行逻辑
如果是CI环境复现,不要拆分多个步骤分别执行不同平台/不同模块的publish命令,必须在同一个Gradle调用中触发全量发布流程,使用标准命令:
./gradlew publishToSonatype closeAndReleaseSonatypeStagingRepository
关键要求:禁止分多次调用publish任务,每一次独立的Gradle publish调用都可能触发新的暂存仓库创建。
临时处理方案
如果配置调整后仍偶发多仓库问题,可以登录Sonatype后台手动将多个分散暂存仓库的文件合并到同一个仓库中,再执行仓库关闭、校验、发布流程,该方案仅作应急使用,长期使用仍需从构建配置层面修复。
内容的提问来源于stack exchange,提问作者Emanuel Moecklin
相关产品推荐
相关产品推荐

