最终 JCenter 关闭对 Gradle 插件门户的影响
目录
简介
ℹ️ 2024 年 7 月 15 日更新 |
---|
我们发现了导致插件解析失败的误报错误。已从列表中删除 4 个插件,导致删除了 9 个依赖项。我们还添加了 105 个依赖于一个或多个受影响插件的插件。这些插件将无法传递解析。未考虑 exclude 导致了第一次更改,第二次更改是由于未考虑插件依赖项。 |
既然 JFrog 已经确认 JCenter 将永久重定向到 Maven Central,我们认为 Gradle 插件门户用户有必要了解该决定对门户及其构建的影响。这篇文章是继 JCenter 重定向到 Maven Central 一天后 我们的报告。
仍然直接使用 JCenter 的用户也应参考 我们最初关于 JCenter 变更及其对 Gradle 构建总体影响的博客文章。
即将到来的插件门户变更 #
JCenter 将永久重定向到 Maven Central。因此,Gradle 插件门户将不再充当 JCenter 代理,而是成为 Maven Central 代理。
对于无法服务的工件查询,Gradle 插件门户将继续返回重定向 (303 See Other
)。从 2024 年 7 月 15 日开始,这些重定向将指向 Maven Central 而不是 JCenter。
此更改可能会影响现有的 Gradle 构建
- 使用依赖项仅在 JCenter 上可用的插件的构建将无法解析。
- 配置为将 Gradle 插件门户用作常规工件仓库(不推荐)的构建可能会受到影响。有关更多信息,请参阅 我们最初的博客文章。
我们的目标是记录插件门户提供的 Gradle 插件的潜在影响。阅读下面的分析,了解如何最大限度地减少对构建的影响。
影响分析 #
我们进行了两项主要分析
- 对于 Gradle 插件门户已知的所有插件,确定如果仅在 Maven Central 上解析其传递依赖项,哪些插件将无法解析。请参阅下方的 插件解析影响。
- 对于 Gradle 插件门户上的所有现有重定向流量,确定如果将重定向指向 Maven Central 而不是 JCenter,将有多少流量会失败。请参阅下方的 依赖解析影响。
插件解析影响 #
在分析时(2024 年 6 月 6 日),插件门户服务了超过 7,400 个插件,每个插件至少有一个已发布的版本。仅考虑每个插件的最新版本,我们发现以下情况
- 322 个唯一的插件 ID 无法解析,即使 JCenter 可用也是如此。这表明它们的使用需要额外的仓库配置。这些已从其余调查中排除。
- 351 个唯一的插件 ID 无法解析,因为当使用 Maven Central 作为代理目标时,缺少传递依赖项。
- 这些失败指向 206 个唯一的
<group>:<artifact>
,总共有 244 个唯一的依赖项(唯一的<group>:<artifact>:<version>
)在 JCenter 上可用,但在 Maven Central 上不可用。 - 此外,104 个插件依赖于上述 351 个失败插件中的一个或多个。由于传递依赖项,它们也很可能无法解析。
有关我们如何获得这些数字的详细信息,请参阅下面的附录中的 测试方法。
我们还根据每个插件版本的发布年份分析了这些数据。您可以在下表中看到细分
发布年份 | 失败插件计数 | 分析的插件总数 |
---|---|---|
2024 | 2 | 1350 |
2023 | 3 | 1205 |
2022 | 7 | 790 |
2021 | 53 | 828 |
2020 | 76 | 803 |
2019 | 54 | 698 |
2018 | 42 | 531 |
2017 | 39 | 533 |
2016 | 23 | 323 |
2015 | 50 | 261 |
2014 | 2 | 61 |
正如我们从数据中看到的那样,最近的插件受更改的影响较小,而较旧的插件更可能受到影响。这意味着较旧的构建更可能受到即将到来的更改的影响。
下一步 #
插件门户上 351 个受影响插件的最新版本描述将更新,以表明它们依赖于 Maven Central 上不可用的依赖项。
我们还将通过电子邮件通知受影响的插件作者,告知他们该问题。我们希望那些仍在维护其插件的人能够解决这种情况。
要检查您的构建是否受到影响,请参阅下面的 资源部分,其中提供了列出受影响插件和依赖项的文件。
依赖解析影响 #
除了下载插件外,Gradle 插件门户还用作项目依赖项的常规工件仓库。虽然从未推荐过这样做,但由于插件门户过去有效地充当 JCenter 的代理,将来有效地充当 Maven Central 的代理,因此它可以工作。
在 7 天内,Gradle 插件门户为它无法服务的工件提供了超过 10 亿次重定向 (303 See Other
)。在分析此流量时,我们将自己限制为与 Maven 仓库模式匹配的文件请求。这些请求达到 500 万个不同的 GAV。在这些请求中,通过关注扩展名为 .pom
、.module
或 .jar
的请求,我们将总数减少到 480 万。
从数据中,我们可以看到构建请求公司内部工件,我们不期望在公共仓库中找到这些工件。Gradle 具有 仓库内容过滤功能,可以加快构建速度并隐藏该信息。我们还看到构建或镜像配置错误。由于这些原因,我们不会公开此数据。
Maven Central 的管理者 Sonatype 证实,在 480 万次请求中,只有 25% 的请求与 Maven Central 已知的 GAV 匹配。
我们还查看了 JFrog 共享的关于 JCenter 的数据,发现只有额外的 3% 的失败请求在 JCenter 上得到解决。提醒一下,JCenter 本身服务于 Maven Central 的所有内容及其托管的文件。
从插件门户方面来看,当请求在 Maven Central 上找不到依赖项时,我们无法知道发出请求的构建是否失败。这是因为请求构建可能配置了额外的仓库。
我们继续不鼓励将 Gradle 插件门户用作代理。如果您的构建逻辑需要非插件依赖项,请将 Maven Central 等仓库添加到您的构建配置中。并确保它具有您需要的依赖项!
资源 #
以下是我们分析期间收集的资源列表。它们可能有助于评估即将到来的更改对您的构建的影响。
- 受影响的插件:包含 351 个插件的列表,这些插件具有 Maven Central 中缺少的依赖项。
- 受影响的插件依赖项:包含 244 个插件依赖项的列表,这些依赖项在 Maven Central 上找不到。
- 传递受影响的插件:包含 104 个插件的列表,这些插件依赖于 351 个失败插件之一。
关于这些分析结果中出现的 org.gradle
坐标,应该怎么办? #
许多 Gradle 工件受到此更改的影响:依赖项和插件。
org.gradle:gradle-*
依赖 #
旧版本 2 和 3 的几个 Gradle 工件已发布到 JCenter。它们也发布到 Gradle 管理的仓库,应该从该位置使用。
但是,由于依赖于这些工件而损坏的插件一开始就不应该有该依赖项。插件在构建中运行时,将使用正在使用的 Gradle 发行版中的类。无法加载这些类的不同版本。因此,我们可以认为这些受影响插件的元数据不正确。我们建议受影响的用户通过 组件元数据规则 或 将上面指示的仓库添加到他们的插件解析中 来清理这些依赖项。
org.gradle.guides.*
插件 #
一些较旧的 Gradle 插件受到影响,因为它们依赖于仅在 JCenter 上可用的包。这些插件已整合到三个 Gradle 文档插件 下,这些插件具有不受影响的更新版本。用户应升级其插件依赖项。
附录 #
插件解析测试方法 #
本节介绍用于确定 插件解析影响 的测试方法。
- 编写一个 Gradle 构建,该构建使用
gradlePluginPortal()
作为仓库来解析插件作为常规依赖项。这意味着我们没有尝试应用插件。- 我们添加了一个具有以下配置的仓库,以考虑依赖于 Google 仓库的 Android 生态系统
google() { content { includeGroupByRegex("com\\.android.*") includeGroupByRegex("com\\.google.*") includeGroupByRegex("androidx.*") includeGroupByRegex("android.*") } }
- 我们添加了一个具有以下配置的仓库,以考虑依赖于 Google 仓库的 Android 生态系统
- 收集这些解析尝试的失败信息。这些失败信息是 322 个失败的插件,即使 JCenter 可用也是如此。
- 收集成功解析的直接依赖项。
- 针对 Maven Central 解析这些直接依赖项,同时考虑依赖项排除。再次使用上面显示的附加
google()
仓库配置。在此阶段排除了插件依赖项,因为预计它们仅针对插件门户解析。 - 收集失败信息。如果使用 Maven Central 而不是 JCenter,这些失败信息是 351 个失败的插件。
- 处理依赖项数据。这就是为我们提供 244 个依赖项,用于 206 个唯一的
<group>:<artifact>
的原因。 - 考虑插件依赖于其中一个失败插件的插件。这会添加回 104 个插件。