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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.29 07:03:27