删除 jcenter() 后如何解决 Android Studio 4.2 构建错误?

How can I resolve Android Studio 4.2 build errors after removing jcenter()?

我已将 Android Studio 从 4.1.3 升级到 4.2,使用最新的 gradle 和 gradle 插件。现在,由于 jcenter 已停产,因此不推荐在构建脚本中使用 jcenter():

建议“迁移”到 mavenCentral()。我有各种似乎不在 mavenCentral() 上的依赖项,因为 gradle 找不到它们,例如:

我用 Google 搜索了工件(在本例中为“materialsearchview”)并在搜索平台“MVNrepository”上找到了它:

所以这是我尝试(全部不成功)将引用放入我的构建脚本以 gradle 找到这个工件的方法:

  1. 我在我的项目级别 build.gradle 文件中添加了对 mvnrepository 的引用(鉴于 mvnrepository 是一种搜索机制,我没想到它会起作用)在红色框中突出显示图片,即:

    maven { url 'https://mvnrepository.com/artifact/' }

  2. 我在 mvnrepository 表示工件所在的底部的蓝色框中添加了对存储库的引用,即

    maven{url'https://repo.spring.io/plugins-release/'}

这产生了一个稍微不同的错误:

Could not HEAD 'https://repo.spring.io/plugins-release/com/miguelcatalan/materialsearchview/1.4.0/materialsearchview-1.4.0.pom'. Received status code 401 from server: Unauthorized
  1. 我找到了此依赖项的 .aar 文件,将其添加到我的 'libs' 目录并更新了我的应用程序模块级别 build.gradle 文件,如下所示:

    实现文件树(include: ['.jar','.aar'], dir: 'libs')

  2. 此时我做了一个'invalidate caches and restart',认为AS需要在gradle识别之前索引新添加的.aar文件。不开心。

  3. 我特地在libs目录下添加了.aar文件,然后在app模块中添加了对它的引用build.gradle:

    实施(名称:'materialsearchview-1.4.0',分机:'aar')

然后又做了一个无效的 cache/restart。不开心。

所以我想我有三个问题:

  1. 一旦我在 mvnrepository 中找到对 artiface 的引用,是否有适当的方法在我的 gradle 脚本中引用它,以便构建系统可以协调它需要的内容?

  2. 还有哪些其他方法可以找到 gradle 可以寻址以查看项目是否存在的其他存储库?

  3. 为什么我在使用 libs 目录中的 .aar 文件时失败了?为什么Gradle在那里看不到它?

谢谢!

在与 CommonsWare 的 Mark Murphy 讨论后,我意识到我对项目级别 build.gradle 文件的存储库部分与模块级别 [=54] 的实现语句之间的关系存在误解=] 文件.

感谢 Mark,这是一个很好的思考方式:

项目级别build.gradle,即:

repositories {
    google()
    mavenCentral()
    maven { url 'https://maven.preemptive.com/' }
    maven { url 'https://jitpack.io' }
    //jcenter()
}

将这些视为“Gradle,查看这些存储库以协调所有 'implementation' 语句。”

然后在模块级别 build.gradle 我有这个:

implementation fileTree(include: ['*.jar','*.aar'], dir: 'libs')

将此视为“哦,是的,也抓住所有这些东西,即使我没有将它们作为特定的依赖项提及”。

我的错误 #1 是认为我可以在 libs 目录中有一个 .aar 文件,它也有相应的 'implementation' 语句。你不能。

我的错误 #2 是我有一个引用 maven 中的 .aar 文件的实现语句(这很好,因为 maven 在我的存储库块中)它本身引用了一个不在 maven 中的 .aar 文件但仅在 jcenter 中(这不是因为我刚刚从存储库块中删除了 jcenter)。当我在存储库块中删除对 j​​center 的引用时,此依赖项(“传递依赖项”)未协调且构建失败。

所以经验教训:

'implementation' 语句中引用的任何资源以及它所依赖的 POM 中的任何资源都必须位于您在存储库块中定义的存储库中。

如果任何依赖项在 jcenter 中,因为我摆脱了 jcenter,那么我必须:

  1. 找到另一个存储库而不是 jcenter,它具有满足与相关资源关联的所有依赖项所需的相同资源,或者
  2. 收集代表该资源的所有 .jar/.aar 文件(你想要的和它引用的所有文件),将它们放在 /libs 目录中(在你正在构建的模块下),确保你的正确形成你的 fileTree 语句,并从你的 'implementations' 语句中删除对所有这些相同资源的引用。

如何识别您询问的所有依赖项?好吧,你可以慢慢来(就像我一开始做的那样)并保留 finding/adding 它们直到构建不再中断。或者你可以更聪明一点,让 Gradle 告诉你如果你问它会做什么(参见文档 here)。

最后 - 不要忘记确保引用的 .aar 文件在库中是不够的。换句话说,Gradle 不会像这样工作:“我将首先查看存储库以满足您的实现依赖项以及它们引用的任何依赖项,如果它们不存在,那么我将查看所有的 .jar 和 . aar 文件放在你告诉我查看 fileTree 语句的地方”。相反,请注意,'implementation' 语句中的项目引用的任何依赖项也需要能够在存储库中找到。如果不能,那么您唯一的选择是使用该依赖关系图,确定所有依赖关系,并将所有 .aar 文件放入 /libs 并从您的 'implementation' 语句中删除任何文件。

如果您能找到另一个存储库而不是弄乱所有单独的 .aar 文件,就会容易得多!

对于那些想尝试更简单的方法的人,只需到这里 Android Studio Archive 下载 Android Studio v4.1(2020 年 10 月 12 日)并安装。没问题,我自己检查过