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.