插件门户中断后续
2023 年 6 月 23 日,协调世界时 9:00,Gradle 用户开始遇到从 Gradle 插件门户 解析工件的问题,这是由于 JFrog 对 JCenter 上托管的工件进行了更改。JCenter 停止直接提供文件,并将所有请求重定向到 Maven Central。这是一个未经宣布的更改。
我们联系了 JFrog,他们回复说这是一个测试,他们将恢复 JCenter 提供工件。
协调世界时 18:30 左右,JCenter 恢复正常行为。
这篇文章描述了这次中断对构建的影响,从类似中断中恢复的方法,以及我们将采取哪些措施来消除对 JCenter 的依赖。
仍然直接使用 JCenter 的用户还应该参考 我们最初的博客文章,了解 JCenter 关闭对 Gradle 构建的一般影响。
对构建中 Gradle 插件使用情况的影响
当 JFrog 停止从 JCenter 提供工件时,所有请求都被重定向到 Maven Central。这可能会以不同的方式影响构建。在这篇博文中,我们重点关注从插件门户解析 Gradle 插件。
背景信息
插件门户网站仅托管与 Gradle 插件相关的工件。插件门户网站将 Gradle 构建重定向到 JCenter 以解析插件所需的传递依赖项。这些传递依赖项中的一部分由 JCenter 托管,而另一部分则从 Maven Central 镜像而来。
此外,JCenter 上也托管了一些非常旧版本的 Gradle 插件。这是因为它们历史上托管在 JFrog 的 Bintray 服务上。继 Bintray 于 2021 年 5 月关闭后,我们移除了插件门户网站与 Bintray 的集成,但我们继续将这些工件重定向到 JCenter,因为 JFrog 承诺无限期地保持 JCenter 的只读状态。
当 JCenter 发生更改时,插件门户网站可能不再提供某些工件,或者提供不同的工件。
缺少工件
当 JCenter 停止提供工件时,任何仅在 JCenter 上可用的工件都将不可用。
例如,10 年前发布到 JCenter 且从未发布到 Maven Central 的库将不再可用。
因此,Gradle 构建在尝试从插件门户网站解析依赖项时可能会失败。这包括:
- 依赖于非常旧版本的插件的构建。这些插件可能仅托管在 JCenter 上,并且该版本的插件可能不再可用。
- 依赖于传递依赖于其他托管在其他地方的库的插件的构建。仅由 JCenter 托管的库可能不再可用。
不同版本
任何依赖于同时发布到 JCenter 和 Maven Central 的工件的插件,在使用动态版本时可能会解析到不同的版本。
例如,一个库发布到 JCenter 之后又发布到 Maven Central,只有发布到 Maven Central 的版本可用。
Gradle 构建可能不会解析依赖项失败,但构建可能会解析不同的版本。
不同工件
任何依赖于同时发布到 JCenter 和 Maven Central 的工件的插件,其行为可能会有所不同。
例如,一个库发布到 JCenter 之后又发布到 Maven Central,即使是同一个版本,也可能具有不同的依赖项。一个库可能在 JCenter 上为 Java 6 构建,而在 Maven Central 上为 Java 8 构建。签名工件可能会受到影响,并由不同的密钥签名。
Gradle 构建可能不会因无法解析依赖项而失败,但这些依赖项的行为可能已发生变化。
使用 依赖项验证 的构建应该会因这些差异而出现验证失败。当上游存储库提供不同的工件时,这些失败需要手动干预。
从失败的构建中恢复
Gradle 无法控制对 JCenter 的更改。在我们能够迁移出 JCenter 之前,这种类型的中断可能会再次发生。
您可以采取一些措施来恢复
- 识别直接使用 JCenter 进行构建逻辑的构建,并将它们更改为使用 Maven Central。
- 识别由 JCenter 提供的构建逻辑依赖项。
如果您有来自 JCenter 的依赖项
- 更新到最新插件版本,因为它可能不再需要仅 JCenter 依赖项。
- 删除未使用的直接依赖项。
- 切换到更新的坐标。一些依赖项可能已迁移到 Maven Central 上的新坐标。
- 迁移到替代库。一些依赖项可能在 Maven Central 上有替代方案。
- 对于传递依赖项,排除不必要的依赖项。
请注意,上述大多数内容也可以应用于仅 JCenter 的应用程序依赖项。
Gradle 正在做什么
Gradle 将分析每个插件的最新版本,并确定哪些需要仅在 JCenter 上可用的传递依赖项。我们的目标是以尽可能少的干扰社区的方式从 JCenter 迁移,以防止再次出现这种意外更改。
根据这些信息,Gradle 将发布一篇后续博客文章,其中包含下一步操作,并联系受影响的插件作者,看看他们是否可以发布仅需要托管在 Maven Central 上的依赖项的插件版本。
在 JCenter 工作的情况下仍无法解析的插件,即依赖项托管在其他存储库中的插件,将不会包含在该分析中。
反馈
如果您有任何问题,请在我们的 论坛 或 Gradle 社区 Slack 上告诉我们。