Библиотека Maven не получает зависимости от частного репозитория внутри POM - PullRequest
2 голосов
/ 05 апреля 2019

Я бился головой об этой проблеме уже несколько дней.

Моя ситуация такова:

  • У меня есть SDK, написанный мной, который использует две зависимости, размещенные в частном репозитории maven, доступ к которому возможен только через логин

    • repo-1 на S3 maven
    • repo-2 на Nexus
  • Этот SDK всегда использовался в моем приложении для Android (но рассматривался как субмодуль) в проекте.

  • Внутри Gradle проекта есть 2 репозитория maven, из которых можно найти две упомянутые выше частные зависимости.

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, из приложения.

Сначала я хочу сделать все локально, чтобы я мог быстрее выполнять разные тесты. Поэтому я «загрузил» свой SDK в моем местном maven.

В 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>

Затем я установил файл settings.xml в корне моего локального maven (../.m2) с учетными данными для доступа к 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 как зависимость в приложение, но не хочу загружать 2 зависимости из частных репозиториев.

НО

Однако, если я добавлю два репозитория maven в gradle проекта приложения (как в первом примере), это сработает, поэтому я почти уверен, что это проблема pom и setting.xml конфигурации.

Большое спасибо всем за ответы

1 Ответ

1 голос
/ 08 апреля 2019

То, с чем вы сталкиваетесь, - это различие в способах обработки репозиториями Maven и Gradle.

Короче говоря, Gradle более строг, и не будет прозрачно загружать зависимости из репозиториев, которые не объявлены в скрипте сборки.

Для более подробной информации о том, почему это так, посмотрите обсуждение в трекере Gradle .

Итак, как вы выяснили, решение состоит в том, чтобы объявить эти репозитории в потребляющем скрипте сборки. Если вы считаете, что это слишком многословно, рассмотрите возможность создания минимального плагина для вашего SDK, который бы добавил зависимости и репозитории.

Тогда он станет:

plugins {
    id 'my-sdk-plugin'
}
...