Зависимость Maven: получить ПОСЛЕДНИЕ репозитории игнорирования из settings.xml

Я пытаюсь загрузить последнюю версию снимка из моего удаленного репозитория (Artifactory. Для этого я использую следующую команду:

mvn dependency:get \
  -Dartifact=com.acme:my-application:LATEST:war \
  -DremoteRepositories=http://localhost:8085/artifactory/libs-snapshots-local/

Репозиторий libs-snapshot-local - это часть Artifactory, в которой хранятся все снимки. Если я открою файл maven-metadata.xml по следующему пути:

http://localhost:8085/artifactory/libs-snapshots-local/com/acme/my-application/maven-metadata.xml

Затем я получаю следующий XML-ответ:

<?xml version="1.0" encoding="UTF-8"?>
<metadata>
  <groupId>com.acme</groupId>
  <artifactId>my-application</artifactId>
  <version>2.0.0-20160222.105839-1</version>
  <versioning>
    <latest>2.0.0-SNAPSHOT</latest>
    <versions>
      <version>2.0.0-SNAPSHOT</version>
    </versions>
    <lastUpdated>20160223132257</lastUpdated>
  </versioning>
</metadata>

Итак, согласно этому файлу, должна быть получена WAR с версией 2.0.0-SNAPSHOT.

Однако когда я выполняю команду, я получаю следующий ответ:

[INFO] Scanning for projects...
[INFO]                                                                         
[INFO] ------------------------------------------------------------------------
[INFO] Building Maven Stub Project (No POM) 1
[INFO] ------------------------------------------------------------------------
[INFO] 
[INFO] --- maven-dependency-plugin:2.8:get (default-cli) @ standalone-pom ---
[INFO] Resolving com.acme:my-application:war:LATEST with transitive dependencies
Downloading: http://download.java.net/maven/2/com/acme/my-application/maven-metadata.xml
Downloading: http://localhost:8085/artifactory/libs-releases/com/acme/my-application/maven-metadata.xml
Downloading: http://repo1.maven.org/maven2/com/acme/my-application/maven-metadata.xml
Downloading: http://localhost:8085/artifactory/libs-snapshots/com/acme/my-application/maven-metadata.xml
Downloading: http://localhost:8085/artifactory/libs-snapshots-local/com/acme/my-application/maven-metadata.xml
Downloaded: http://localhost:8085/artifactory/libs-snapshots-local/com/acme/my-application/maven-metadata.xml (378 B at 23.1 KB/sec)
Downloaded: http://localhost:8085/artifactory/libs-snapshots/com/acme/my-application/maven-metadata.xml (378 B at 0.5 KB/sec)
Downloaded: http://localhost:8085/artifactory/libs-releases/com/acme/my-application/maven-metadata.xml (898 B at 0.6 KB/sec)
Downloading: http://localhost:8085/artifactory/libs-releases/com/acme/my-application/1.0.0/my-application-1.0.0.pom
Downloaded: http://localhost:8085/artifactory/libs-releases/com/acme/my-application/1.0.0/my-application-1.0.0.pom (26 KB at 1475.0 KB/sec)
Downloading: http://localhost:8085/artifactory/libs-releases/com/acme/my-application/1.0.0/my-application-1.0.0.war
Downloaded: http://localhost:8085/artifactory/libs-releases/com/acme/my-application/1.0.0/my-application-1.0.0.war (77415 KB at 9657.4 KB/sec)

Похоже, цель dependency:get пытается загрузить артефакт, просматривая все репозитории внутри моего файла settings.xml и параметра -DremoteRepositories.

В связи с этим он также просматривает мой репозиторий выпусков, который содержит выпуск 1.0.0, который был загружен позже, чем 2.2.0-SNAPSHOT.

Мой файл settings.xml выглядит так:

<?xml version="1.0" encoding="UTF-8"?>
<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
                      http://maven.apache.org/xsd/settings-1.0.0.xsd">

    <pluginGroups>
        <pluginGroup>org.mortbay.jetty</pluginGroup>
    </pluginGroups>
    <profiles>
        <profile>
            <repositories>
                <repository>
                    <snapshots>
                        <enabled>false</enabled>
                    </snapshots>
                    <id>central</id>
                    <name>libs-releases</name>
                    <url>http://localhost:8085/artifactory/libs-releases</url>
                </repository>
                <repository>
                    <snapshots />
                    <id>snapshots</id>
                    <name>libs-snapshots</name>
                    <url>http://localhost:8085/artifactory/libs-snapshots</url>
                </repository>
                <repository>
                    <id>Maven</id>
                    <name>Maven Repository</name>
                    <url>http://repo1.maven.org/maven2/</url>
                </repository>
                <repository>
                    <id>Java</id>
                    <name>Java Repository</name>
                    <url>http://download.java.net/maven/2/</url>
                </repository>
            </repositories>
            <id>artifactory</id>
        </profile>
    </profiles>
    <activeProfiles>
        <activeProfile>artifactory</activeProfile>
    </activeProfiles>
</settings>

Есть ли способ запретить maven-dependency-plugin использовать репозитории, определенные в settings.xml, и только зависимость, указанную в команде?


person g00glen00b    schedule 23.02.2016    source источник
comment
Почему бы просто не использовать сам maven, используя mvn -U ...?   -  person khmarbaise    schedule 23.02.2016


Ответы (1)


Читая исходный код, вы описываете в точности поведение _ 1_ цель. Он добавит к remoteRepositories, указанному в командной строке, список текущих активных репозиториев.

Скопируйте код здесь для справки:

if ( pomRemoteRepositories != null )
{
    repoList.addAll( pomRemoteRepositories );
}

можно видеть, что переменная repoList, которая позже будет использоваться для списка репозиториев для проверки, всегда будет содержать активные репозитории, и в настоящее время нет никакого способа обойти это.

Список активных репозиториев извлекается с помощью:

@Parameter( defaultValue = "${project.remoteArtifactRepositories}", readonly = true, required = true )
private List<ArtifactRepository> pomRemoteRepositories;

Это также означает, что это не может быть переопределено в командной строке (оно доступно только для чтения и не имеет свойства пользователя).

Таким образом, в вашем случае это приводит к тому, что все ваши репозитории, определенные в профиле artifactory, также будут использоваться, поскольку он объявлен активным.


Единственный возможный обходной путь, который я вижу, - это вызвать Maven с файлом settings.xml по умолчанию (тот, который находится в установке Maven для пример). Или создайте запрос функции в их Jira, чтобы запросить этот вариант использования (я не мог не нахожу ничего относящегося к этому).

person Tunaki    schedule 23.02.2016