android - Maven 库不从 POM 中的私有(private)存储库获取依赖项

标签 android maven gradle repository nexus

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

我的情况是这样的:

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

    • repo-1 托管在 S3 maven 上
    • repo-2 托管在 Nexus 上
  • 这个 sdk 一直在我的项目中的 Android 应用程序中使用(但被视为子模块)。

  • 在项目的 Gradle 中有 2 个 maven 存储库,可以从中查找上面提到的 2 个私有(private)依赖项。

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使用,app完全不知道

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

首先我想在本地做所有事情,这样我可以更快地做不同的测试。 因此,我在本地 maven 中“上传”了我的 SDK。

在我生成的 POM 中,我拥有对 SDK 的所有必要依赖项(包括私有(private)存储库的 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 个私有(private)依赖项:

<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 文件,使用访问 2 个存储库的凭据。

<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 添加为应用程序中的依赖项,但不想从私有(private)存储库下载这 2 个依赖项。

但是

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

非常感谢大家的回答

最佳答案

您面临的是 Maven 和 Gradle 处理存储库的方式之间的差异。

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

有关为什么会出现这种情况的更多详细信息,请查看 the discussion in the Gradle issue tracker .

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

它会变成:

plugins {
    id 'my-sdk-plugin'
}

关于android - Maven 库不从 POM 中的私有(private)存储库获取依赖项,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55537250/

相关文章:

android - 使用 ListView 在下一个 Activity 中显示数据库详细信息

java - 是否应该将 mvnw 文件添加到存储库中?

spring - 无法实例化 bean : Constructor threw exception; nested exception is java. lang.NullPointerException

android - 将流量转换为实时数据的最佳方式

android - 两个手指或 pinc 缩放到 osmdroid 中的 map View

使用 `implementation`时Gradle依赖冲突

android - 尝试在 Canary 5 上迁移

spring-boot - 为什么我需要在构建之前手动运行清理?

java - 确保 "Google Maps Android API v2"已启用。即使已经启用

java - 如何将jar文件转换为war并部署到tomcat服务器中