Maven库不会从POM内部的私有存储库中获得依赖关系

时间:2019-04-05 14:08:25

标签: android maven gradle repository nexus

几天来我一直在努力解决这个问题。

我的情况是这样:

  • 我有一个由我编写的sdk,它使用托管在私有maven存储库中的两个依赖项,只能通过登录名来访问

    • repo-1 托管在S3 Maven上
    • Nexus上托管的
    • repo-2
  • 此sdk始终在项目中的我的Android应用中使用(但被视为子模块)。

  • 在项目的Gradle内部,有2个Maven存储库可用于查找上述2个私有依赖项。

maven {
    name “repo-1”
    url "s3://repo-1/maven"
    credentials(AwsCredentials) {
        accessKey awsUsername
        secretKey awsPassword
    }
}

maven {
    name “repo-2”
    url "http://repo-2/repository/maven-releases"
    credentials {
        username ‘repo-2-name’
        password ‘repo-2-password’
    }
}
  • 上面提到的2个依赖项仅由sdk使用,应用程序完全不知道它

现在,我想将两者完全分开,并将SDK托管在我的私有Maven存储库中,以便从应用程序中隐藏所有与SDK相关的代码和依赖项。

首先,我想在本地进行所有操作,因此可以更快地执行不同的测试。 因此,我在本地Maven中“上传”了我的SDK。

在生成的POM中,我具有对SDK的所有必需依赖项(包括私有存储库的2个依赖项),如下所示:

<packaging>aar</packaging>
    <dependencies>
            <dependency>
                 <artifactId>repo-1</artifactId>
                    <groupId>com.repo-1.android</groupId>
                    <version>0.0.1</version>
            </dependency>
        <dependency>
                <artifactId>repo-2</artifactId>
                <groupId>com.repo-2.android</groupId>
                <version>1.0.0</version>
        </dependency>

此外,我还添加了2个存储库,必须从中下载2个私有依赖项:

<repositories>
        <repository>
            <id>repo-1</id>
            <name>repository-1</name>
            <url>http://repo-1/repository/maven-releases</url>
        </repository>
        <repository>
            <id>repo-2</id>
            <name>repository-2</name>
            <url>s3://repo-1/maven</url>
        </repository>
</repositories>

然后我在本地Maven(../.m2)的根目录中设置 settings.xml 文件,并使用访问两个存储库的凭据。

<settings 
    xmlns="http://maven.apache.org/SETTINGS/1.0.0"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://maven.apache.org/SETTINGS/1.0.0
        https://maven.apache.org/xsd/settings-1.0.0.xsd">
     <servers>
            <server>
                <id>repo-1</id>
                <username>awsPassword</username>
                <password>awsPassword</password>
            </server>
            <server>
                <id>repo-2</id>
                <username>repo-2-name</username>
                <password>repo-2-password</password>
            </server>
    </servers>
</settings>

然后我将sdk添加为应用程序中的依赖项,但不想从私有存储库中下载这两个依赖项。

但是

但是,如果我将两个maven存储库添加到应用程序项目的gradle中(如第一个示例一样),它就可以了,所以我很确定这是 pom setting.xml 配置。

非常感谢大家的回答

1 个答案:

答案 0 :(得分:1)

您面对的是Maven和Gradle处理存储库的方式不同。

简而言之,Gradle更为严格,并且不会从未在构建脚本中声明的存储库中透明下载依赖项。

要详细了解这种情况,请查看the discussion in the Gradle issue tracker

因此,您发现的解决方案是在使用的构建脚本中声明这些存储库。 如果您认为这太冗长,请考虑为您的SDK编写一个最小的插件,该插件将添加依赖项和存储库。

它将变成:

plugins {
    id 'my-sdk-plugin'
}