DependencyResolutionException при обновлении с Maven 2.2.1 до Maven 3.0.4

Я пытаюсь обновить свой проект с Maven 2.2.1 до Maven 3.0.4, но у меня возникают проблемы с разрешением зависимостей. Я провел целый день, пытаясь исследовать это, просматривая документацию Maven и подобные посты, но я все еще застрял. Это мой первый вопрос по stackru, так что, надеюсь, я достаточно хорошо следовал здесь этикету. Спасибо за вашу помощь!

Моя структура проекта выглядит следующим образом:

pom.xml (acme-parent)
child-alpha
+-----> pom.xml

Кроме того, у меня есть следующие файлы в моем собственном хранилище:

http://maven.my-own-repo.com/acme/child-dep-jdk15/maven-metadata-local.xml
http://maven.my-own-repo.com/acme/child-dep-jdk15/1.0/child-dep-jdk15-1.0.jar
http://maven.my-own-repo.com/acme/child-dep-jdk15/1.0/child-dep-jdk15-1.0.pom

child-alpha/pom.xml, в свою очередь, имеет зависимость профиля от моего собственного acme:child-dep-jdk15, который был отдельно встроен в файл jar и имеет собственный файл.pom, в котором указан родительский объект, который является тем же родителем acme родитель как ребенок-альфа.

Вот выдержки из соответствующих файлов:

acme-parent pom.xml:

<?xml version="1.0" encoding="UTF-8"?>
<project>
    <modelVersion>4.0.0</modelVersion>
    <groupId>acme</groupId>
    <artifactId>acme-parent</artifactId>
    <name>Acme Parent Project</name>
    <version>1</version>
    <packaging>pom</packaging>

    <properties>...</properties>

    <modules>
        <module>child-alpha</module>
    </modules>

    <repositories>
        <repository>
            <id>acme-repo</id>
            <url>http://maven.my-own-repo.com</url>
        </repository>
        <repository>
            <id>central</id>
            <url>http://repo1.maven.org/maven2</url>
        </repository>
    </repositories>

    <pluginRepositories>...</pluginRepositories>

    <build>
      <plugins>...</plugins>
    </build>

    <dependencies>...</dependencies>
</project>

child-alpha pom.xml:

<project>
    <modelVersion>4.0.0</modelVersion>
    <parent>
        <groupId>acme</groupId>
        <artifactId>acme-parent</artifactId>
        <version>1</version>
    </parent>
    <artifactId>child-alpha</artifactId>
    <name>Child Alpha Project</name>
    <version>1.0</version>
    <packaging>jar</packaging>

    <scm>...</scm>

    <properties>...</properties>

    <build>
      <resources>...</resources>
      <plugins>...</plugins>
    </build>

    <profiles>
        <profile>
            <id>jdk15</id>
            <activation>
                <activeByDefault>true</activeByDefault>
                <jdk>1.5</jdk>
            </activation>
            <dependencies>
                <dependency>
                    <groupId>acme</groupId>
                    <artifactId>child-dep-jdk15</artifactId>
                    <version>1.0</version>
                </dependency>
            </dependencies>
        </profile>
    </profiles>

    <dependencies>...</dependencies>
</project>

ребенок-отд-jdk15-1.0.pom:

<project>
    <modelVersion>4.0.0</modelVersion>
    <parent>
        <groupId>acme</groupId>
        <artifactId>acme-parent</artifactId>
        <version>1</version>
    </parent>
    <groupId>acme</groupId>
    <artifactId>child-dep-jdk15</artifactId>
    <name>Acme Child Dependency</name>
    <version>1.0</version>
    <packaging>jar</packaging>

    <build>...</build>

    <dependencies>...</dependencies>
</project>

Когда я попытался построить child-alpha (находясь в каталоге child-alpha), я выполнил следующую команду:

mvn -U -e clean install

И я получил следующие сообщения журнала и трассировки стека (посторонние сообщения удалены):

Downloading: http://maven2.my-own-repo.com/acme/acme-parent/1/acme-parent-1.pom
Downloading: http://repo1.maven.org/maven2/acme/acme-parent/1/acme-parent-1.pom

[...]

[ERROR] Failed to execute goal on project child-alpha: Could not resolve dependencies for project acme:child-alpha:jar:1.0: [...]

Caused by: org.apache.maven.project.DependencyResolutionException: Could not resolve dependencies for project acme:child-alpha:jar:1.0: [...]

Caused by: org.sonatype.aether.collection.DependencyCollectionException: Failed to collect dependencies for [...]
    at org.sonatype.aether.impl.internal.DefaultDependencyCollector.collectDependencies(DefaultDependencyCollector.java:258)
    at org.sonatype.aether.impl.internal.DefaultRepositorySystem.collectDependencies(DefaultRepositorySystem.java:308)
    at org.apache.maven.project.DefaultProjectDependenciesResolver.resolve(DefaultProjectDependenciesResolver.java:150)
    ... 23 more
Caused by: org.sonatype.aether.resolution.ArtifactDescriptorException: Failed to read artifact descriptor for acme:child-dep-jdk15:jar:1.0
    at org.apache.maven.repository.internal.DefaultArtifactDescriptorReader.loadPom(DefaultArtifactDescriptorReader.java:331)
    at org.apache.maven.repository.internal.DefaultArtifactDescriptorReader.readArtifactDescriptor(DefaultArtifactDescriptorReader.java:186)
    at org.sonatype.aether.impl.internal.DefaultDependencyCollector.process(DefaultDependencyCollector.java:412)
    at org.sonatype.aether.impl.internal.DefaultDependencyCollector.collectDependencies(DefaultDependencyCollector.java:240)
    ... 25 more
Caused by: org.apache.maven.model.resolution.UnresolvableModelException: Could not find artifact acme:acme-parent:pom:1 in acme-repo (http://maven.my-own-repo.com)
    at org.apache.maven.repository.internal.DefaultModelResolver.resolveModel(DefaultModelResolver.java:126)
    at org.apache.maven.model.building.DefaultModelBuilder.readParentExternally(DefaultModelBuilder.java:813)
    at org.apache.maven.model.building.DefaultModelBuilder.readParent(DefaultModelBuilder.java:664)
    at org.apache.maven.model.building.DefaultModelBuilder.build(DefaultModelBuilder.java:310)
    at org.apache.maven.model.building.DefaultModelBuilder.build(DefaultModelBuilder.java:232)
    at org.apache.maven.repository.internal.DefaultArtifactDescriptorReader.loadPom(DefaultArtifactDescriptorReader.java:322)
    ... 28 more
Caused by: org.sonatype.aether.resolution.ArtifactResolutionException: Could not find artifact acme:acme-parent:pom:1 in acme-repo (http://maven.my-own-repo.com)
    at org.sonatype.aether.impl.internal.DefaultArtifactResolver.resolve(DefaultArtifactResolver.java:538)
    at org.sonatype.aether.impl.internal.DefaultArtifactResolver.resolveArtifacts(DefaultArtifactResolver.java:216)
    at org.sonatype.aether.impl.internal.DefaultArtifactResolver.resolveArtifact(DefaultArtifactResolver.java:193)
    at org.apache.maven.repository.internal.DefaultModelResolver.resolveModel(DefaultModelResolver.java:122)
    ... 33 more
Caused by: org.sonatype.aether.transfer.ArtifactNotFoundException: Could not find artifact acme:acme-parent:pom:1 in acme-repo (http://maven.my-own-repo.com)
    at org.sonatype.aether.connector.wagon.WagonRepositoryConnector$4.wrap(WagonRepositoryConnector.java:947)
    at org.sonatype.aether.connector.wagon.WagonRepositoryConnector$4.wrap(WagonRepositoryConnector.java:941)
    at org.sonatype.aether.connector.wagon.WagonRepositoryConnector$GetTask.run(WagonRepositoryConnector.java:669)
    at org.sonatype.aether.util.concurrency.RunnableErrorForwarder$1.run(RunnableErrorForwarder.java:60)
    at java.util.concurrent.ThreadPoolExecutor$Worker.runTask(ThreadPoolExecutor.java:886)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:908)
    at java.lang.Thread.run(Thread.java:680)

При использовании Maven 2 мне никогда не требовался родительский файл acme pom.xml по следующему адресу: http://maven2.my-own-repo.com/acme/acme-parent/1/acme-parent-1.pom

Причина, по которой у нас нет родительского pom.xml в нашем собственном репо, заключается в том, что у нас есть скрипт, используемый при создании веток контроля версий, который изменяет некоторые значения в acme-parent pom.xml в зависимости от того, в какой ветке мы находимся, поэтому было бы сложно поместить этот pom.xml в репозиторий и поддерживать его в актуальном состоянии для всех различных веток, которые мы пытаемся построить одновременно с нашим сервером непрерывной интеграции.

В Maven 2 при выполнении сборок child-alpha у Maven не будет проблем с поиском acme-parent pom.xml на один каталог вверх, то есть с относительным путем../pom.xml, поэтому он никогда не попытается перейти в мои репозитории. найти его. Наличие родительского pom.xml только в моей локальной кассе и отсутствие его в репо работало нормально в Maven 2.

Однако, когда я попытался построить child-alpha под Maven 3.0.4, произошло исключение выше. Сначала я подумал, что нужно явно установить относительный путь в тегах в верхней части pom.xml дочерней альфы, но это не помогло - и файл pom.xml для acme-parent действительно уже находится в относительном пути по умолчанию для../pom.xml, так что нет необходимости явно устанавливать его.

Затем я попытался прокомментировать зависимость child-dep-jdk15 в разделе pom.xml дочерней альфы. Сборка child-alpha maven успешно завершается с этой закомментированной зависимостью.

Я не понимаю, почему child-alpha не будет создаваться в Maven 3, когда есть зависимость child-dep-jdk15. Если Maven смог правильно найти файл acme-parent pom.xml изначально (для каждого блока сверху), почему он теперь пытается загрузить его из репозитория при обработке зависимости child-dep-jdk15? Я что-то настроил неправильно, и если да, то как мне это исправить?

Еще одна вещь: если я впервые запустите mvn -N install в том же каталоге, что и файл pom.xml acme-parent, а затем попробуйте собрать дочернюю альфу, тогда сборка дочерней альфы завершится успешно, даже если в коде сохраняется зависимость child-dep-jdk15. После запуска этой команды я могу убедиться, что acme-parent-1.pom находится в моем локальном каталоге.m2. Хотя этот обходной путь может подойти для отдельных разработчиков, он будет проблемой для нашего сервера непрерывной интеграции, который должен иметь возможность запускать параллельные сборки для разных ветвей.

Я бы настоятельно предпочел не перенастраивать свой репозиторий для размещения acme-parent pom.xml из-за изменений ветвления контроля версий, о которых я упоминал выше.

1 ответ

В Maven 3, если вы только что потерпели неудачную загрузку и исправили ее (например, загрузив jar-файл в репозиторий), он будет кешировать ошибку. Для принудительного обновления добавить -U в командной строке.

По другим возможным причинам DependencyResolutionException см. Maven Confluence.

Другие вопросы по тегам