下载时,Maven 错误地将传递性 AAR 依赖项解析为 JAR 并且无法获取它

问题描述 投票:0回答:1

我正在尝试使用 Maven 项目下载一些 Android 依赖项(我不想使用 Gradle,因为它生成带有哈希值的目录,这使得很难找到文件)。我已经配置了几个依赖库,大部分都可以成功下载到本地仓库。但是,我在配置以下依赖项时遇到了问题:

<dependency>
    <groupId>android.arch.persistence.room</groupId>
    <artifactId>runtime</artifactId>
    <version>1.1.1</version>
    <type>aar</type>
</dependency>

此依赖对另一个 AAR 库(com.android.support:support-core-utils:jar:26.1.0)有传递依赖,但 Maven 错误地将其识别为 JAR,导致下载失败。

我尝试使用dependencyManagement来指定类型,但没有效果:

<dependencyManagement>
    <dependencies>
        <dependency>
            <groupId>com.android.support</groupId>
            <artifactId>support-core-utils</artifactId>
            <type>aar</type>
        </dependency>
    </dependencies>
</dependencyManagement>

有没有办法让Maven正确识别间接AAR依赖?

maven aar
1个回答
0
投票

说实话,对于你的场景我都不会使用Apache Maven。您正在尝试使用成熟的项目构建工具来解决传递包管理器的典型任务,该工具的集成依赖项管理器只是众多工具中的一个,实际上并不应该独立使用。只要看看这个 Stackoverflow Thread 就能看到抽筋的情况。

除了 Gradle 之外,还有 Maven 的替代方案。对于构建任务,还可以结合使用 Apache Ant 作为构建自动化工具,以及 Apache Ivy 作为依赖项管理器。 Ivy 非常灵活,您可以解决您需要的任何与依赖相关的任务。而且——您可以独立使用它

因此,以下步骤将下载

android.arch.persistence.room:runtime:1.1.1
及其所有传递依赖项,包括。
com.android.support:support-core-utils:26.1.0
-- 后者正确地作为
.aar
文件。

  1. 下载 Ivy,解压存档并将

    .jar
    文件复制到您需要的位置。或者安装 Ivy(如果系统的包管理器可用)。

  2. 让我们定义您要检索的内容。为您的需求编写一个非常简单的——Ivy 模块描述符文件,简称“Ivy 文件”。通常它被命名为

    ivy.xml
    。如您所见,它描述了您感兴趣的软件包。如果您需要更多软件包,只需添加另一个
    <dependency>
    。传递依赖项将自动下载。

<ivy-module version='2.0'>
    <info organisation='org.apache' module='ivy'/>
    <dependencies>
        <dependency org='android.arch.persistence.room' name='runtime' rev='1.1.1'/>
    </dependencies>
</ivy-module>
  1. 接下来我们定义从哪里获取包。编写一个Ivy 设置文件。除了 Central Maven Repo 之外,Google 的 Maven Repo 也被配置为后备。
<?xml version='1.0' encoding='UTF-8'?>
<ivysettings>
    <settings defaultResolver='maven' />
    <resolvers>
        <chain name='maven'>
            <ibiblio name='Repository repo1.maven.org' m2compatible='true' root='https://repo1.maven.org/maven2' />
            <ibiblio name='Repository maven.google.com' m2compatible='true' root='https://maven.google.com' />
        </chain>
    </resolvers>
</ivysettings>
  1. 调用常春藤。根据需要插入正确的路径。结果将被放入
    target_dir
    。如果您跳过选项
    -cache
    ,下载的包将存储在默认的本地存储库
    $HOME/.ivy2/cache/
    中。
java -jar <path>/ivy-2.5.2.jar -ivy <path>/ivy.xml -settings <path>/ivysettings.xml -cache <target_dir>

如果您查看结果,例如使用

tree <target_dir>
,您将找到您错过的文件:

<target_dir>/com.android.support/support-core-utils/aars/support-core-utils-26.1.0.aar

就是这样。


P.S.:如果您不喜欢,例如输出子目录的结构,或者其他什么——你可以将任何内容配置为你想要的

© www.soinside.com 2019 - 2024. All rights reserved.