插件门户中断后续跟进
简介
ℹ️ 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 构建可能会失败。这包括
- 依赖于非常旧版本的插件的构建。这些插件可能只托管在 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 上告知我们。