插件门户中断后续

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 构建在尝试从插件门户网站解析依赖项时可能会失败。这包括:

  1. 依赖于非常旧版本的插件的构建。这些插件可能仅托管在 JCenter 上,并且该版本的插件可能不再可用。
  2. 依赖于传递依赖于其他托管在其他地方的库的插件的构建。仅由 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 之前,这种类型的中断可能会再次发生。

您可以采取一些措施来恢复

  1. 识别直接使用 JCenter 进行构建逻辑的构建,并将它们更改为使用 Maven Central。
  2. 识别由 JCenter 提供的构建逻辑依赖项。

如果您有来自 JCenter 的依赖项

  1. 更新到最新插件版本,因为它可能不再需要仅 JCenter 依赖项。
  2. 删除未使用的直接依赖项。
  3. 切换到更新的坐标。一些依赖项可能已迁移到 Maven Central 上的新坐标。
  4. 迁移到替代库。一些依赖项可能在 Maven Central 上有替代方案。
  5. 对于传递依赖项,排除不必要的依赖项。

请注意,上述大多数内容也可以应用于仅 JCenter 的应用程序依赖项。

Gradle 正在做什么

Gradle 将分析每个插件的最新版本,并确定哪些需要仅在 JCenter 上可用的传递依赖项。我们的目标是以尽可能少的干扰社区的方式从 JCenter 迁移,以防止再次出现这种意外更改。

根据这些信息,Gradle 将发布一篇后续博客文章,其中包含下一步操作,并联系受影响的插件作者,看看他们是否可以发布仅需要托管在 Maven Central 上的依赖项的插件版本。

在 JCenter 工作的情况下仍无法解析的插件,即依赖项托管在其他存储库中的插件,将不会包含在该分析中。

反馈

如果您有任何问题,请在我们的 论坛Gradle 社区 Slack 上告诉我们。

讨论