Maven Central 开始限流,每个 Java 开发者都该花两分钟看一眼

2026 年 6 月,Java 圈一件不大不小的事悄悄落地了:免费了二十多年的 Maven Central,开始对发布限流,正式引入了付费层级。

二十年来谁都能免费上传下载的公共仓库。它第一次明确划出了一条线:超过这个量,要么收手,要么付费。

AI 把软件迭代的速度,抬到了基础设施扛不住的地步。软件开发从月抛到日抛。一个需求下来,几个小时就能撸出能跑的版本,CI/CD 流水线一天被触发几十次是常态。我自己最直接的体感来自 GitHub Actions:一个 AI 辅助的重构分支,我一天往里推二十多次 commit,每次都跑一整套构建加测试,那个月的免费额度没撑到月底就见了底。机器不知道累,额度知道。

GitHub Actions 的计算额度,只是先撞上来的那一个。同样的压力顺着 CI/CD 这条管子,一路压到了发布环节——很多流水线每次合并就自动 deploy 一个版本到公共仓库。于是这一回,轮到 Maven Central 扛不住了。

10% 的大户,吃掉了 90% 的公共资源

Maven Central 二十多年免费,服务器和带宽的账,一直是 Sonatype 这家公司自己掏钱扛着的。扛了二十年没喊累,为什么偏偏现在松口?Sonatype 公布了一组数据,挺扎心的:

发布到 Maven Central 的所有文件里,超过 88% 是由仅仅 10% 的命名空间产生的;这 10% 还消耗了新版本 90% 以上的存储,贡献了 70% 以上的发布事件^1^。

所以 Sonatype 这次的动作,本质不是”开始收过路费”,而是”给白嫖大户立规矩”。官方反复强调一句话:对绝大多数社区开源项目,依然免费。这次盯上的,是那种商业规模、基础设施规模的高频发布。

怎么查自己超没超?

Maven Central 盯发布大户,以组织为单位统计(名下所有命名空间合并计算),用三个月度指标衡量:Maven Central 盯发布大户,以组织为单位统计(名下所有命名空间合并计算),用三个月度指标衡量:

  • 文件数量:该周期内发布的文件总数
  • 发布体积:这些文件的总大小
  • 发布次数:累计 release 的次数

根据 Reddit 上的反馈,正常情况下月度推送应在 5 次左右。但由于每次推送的文件数量和体积不尽相同,限流阈值实际上是动态的,大致浮动在 3 到 7 次之间。

登录 Maven Central 的 Usage Center,它是你这个组织发布用量的唯一权威出处。进去能看到按组织聚合(跨你名下所有命名空间)的三个数:发布体积、文件数、发布次数。每个指标是一张用量卡片,直接标出你是”在限额内””接近限额”还是”已超标”,用到 75% 开始预警,90% 以上转成红色的严重警告。

Maven Central Pro 是什么?

如果你的发布量本来就是商业或基础设施规模,减不下来、也不该减,那就走 Maven Central Publisher Pro。

那 Pro 到底是什么?官方说得很直白:它是给”发布活动经常超出免费额度”的组织准备的付费通道,买到的是更高的发布容量上限,外加 Sonatype 的直接技术支持。目标客户是那种把 Maven Central 当成自家商业软件交付链一环的组织,比如大型 SDK、批量生成的客户端、agent、集成件、平台组件、高频 release 流这一类。

  • Pro 不是给普通开源项目准备的,绝大多数人继续免费就行。
  • 官方页面到现在都没有公开标价,走的是”留资、联系 Sonatype 面谈”的模式,具体多少钱按你的发布规模一事一议^5^。所以网上谁要是信誓旦旦报一个 Pro 的年费数字,先打个问号。

发布机制也换代了

收费限流是一面,发布机制换代是另一面,两件事前后脚落地。你以前用来发版的那套 OSSRH,已经在 2025 年 6 月 30 日正式关停了,所有命名空间都被迁到了新的 Central Publisher Portal。如果你的发布脚本还是几年前配的老黄历,现在大概率已经发不出去了。两条路可以走:

  • 图快:用官方的 OSSRH Staging API 兼容层,它把一部分旧的 Nexus 2 接口翻译成了新门户的接口。你只要换一个 Portal 的 user token,把插件指向新的 URL,基本就能续上。
  • 图彻底:直接对接新门户,用原生 Maven 插件、Bundle 上传或者直接调 API。

项目变更

apache 下边的项目不受影响,如果你的项目正在在 apache 基金会孵化,或者已经是顶级项目,Sonatype 说了,你们的发布额度不会被限流

比如不少项目迁进了 dromara 这样的国内社区,groupId 统一成 org.dromara),现在需要反过来回归到开发者个人的命名空间下(比如 io.github.你的名字)。