插件门户中断后续跟进

目录

简介

ℹ️ 2024年7月15日更新
请参阅我们最近的博客文章,了解关于插件门户和 JCenter 的最新信息。

2023年6月23日UTC时间9:00,由于 JFrog 对 JCenter 托管的构件进行了更改,Gradle 用户开始遇到从 Gradle 插件门户解析构件的问题。JCenter 停止直接提供文件,并将所有请求重定向到 Maven Central。这是一个未事先声明的更改。

我们联系了 JFrog,他们回复说这是一个测试,他们将恢复 JCenter 提供构件的原始行为。

大约在 UTC 时间 18:30,JCenter 恢复了正常行为。

这篇文章描述了此次中断对构建的影响、从类似中断中恢复的方法,以及我们未来将如何消除对 JCenter 的依赖。

仍然直接使用 JCenter 的用户也应参考我们关于 JCenter 在 Gradle 构建中全面关闭的原始博客文章

Gradle 插件在构建中的使用影响 #

当 JFrog 停止从 JCenter 提供构件时,所有请求都被重定向到 Maven Central。这可能会以不同的方式影响构建。在这篇博文中,我们重点关注从插件门户解析 Gradle 插件。

背景信息 #

插件门户仅托管与 Gradle 插件相关的构件。插件门户将 Gradle 构建重定向到 JCenter,以解析插件所需的传递依赖项。其中一些传递依赖项由 JCenter 托管,另一些则从 Maven Central 镜像。

此外,一些非常旧版本的 Gradle 插件也托管在 JCenter 上。这是因为它们历史上托管在 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 上告知我们。

讨论