插件门户中断后续

目录

引言

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

2023年6月23日UTC时间9:00,Gradle用户开始遇到从Gradle插件门户解析构件的问题,原因是JFrog对JCenter上托管的构件进行了更改。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上告知我们。

讨论