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

Posted

技术标签:

【中文标题】删除 jcenter() 后如何解决 Android Studio 4.2 构建错误?【英文标题】:How can I resolve Android Studio 4.2 build errors after removing jcenter()? 【发布时间】:2021-07-31 23:59:33 【问题描述】:

我已使用最新的 gradle 和 gradle 插件将 android Studio 从 4.1.3 升级到 4.2。由于 jcenter 的生命周期结束,现在不推荐在构建脚本中使用 jcenter():

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

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

所以这是我尝试(均未成功)将引用放入我的构建脚本以让 gradle 找到此工件的方法:

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

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

    我添加了对底部蓝色框中标识的存储库的引用,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

    我找到了此依赖项的 .aar 文件,将其添加到我的“libs”目录并更新了我的应用模块级 build.gradle 文件,如下所示:

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

    此时我做了一个“使缓存无效并重新启动”,认为 AS 需要在 gradle 识别之前索引新添加的 .aar 文件。不开心。

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

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

然后又进行了一次无效缓存/重新启动。不开心。

所以我想我有三个问题:

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

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

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

谢谢!

【问题讨论】:

【参考方案1】:

在与 CommonsWare 的 Mark Murphy 讨论后,我意识到我对项目级 build.gradle 文件的 repositories 部分和模块级 build.gradle 文件的实现语句之间的关系存在误解。

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

项目级build.gradle,即:

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

将这些视为“Gradle,查看这些存储库以协调所有‘实现’语句。”

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

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

可以把它想象成“哦,是的,也抓住所有这些东西,即使我没有提到它们是特定的依赖关系”。

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

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

所以吸取了教训:

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

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

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

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

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

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

【讨论】:

所以jcenter要走了,还是没有替代品?将来,我们必须浪费时间寻找其他存储库,并且必须为每个项目都这样做? 我认为开发人员正在转向 mavenCentral(),但我也认为绝大多数人离开 jcenter() 还需要一段时间。看看 Realm/MongoDB,这是一个相当规模的组织,他们仍然没有将 Realm RecyclerView Adapter 库从 jcenter() 中移出。【参考方案2】:

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

【讨论】:

请避免基于链接的答案。

以上是关于删除 jcenter() 后如何解决 Android Studio 4.2 构建错误?的主要内容,如果未能解决你的问题,请参考以下文章

Android Studio Gradle:请从您的构建脚本中删除 `jcenter()` Maven 存储库的使用/JCenter 已结束生命周期

作为使用者如何应对JCenter远程仓库停止维护

作为使用者如何应对JCenter远程仓库停止维护

作为使用者如何应对JCenter远程仓库停止维护

作为使用者如何应对JCenter远程仓库停止维护

gradle刷新后jcenter 502坏网关[关闭]