我正在尝试将我的项目从 Maven 2.2.1 升级到 Maven 3.0.4,但是遇到了依赖解析的问题。我花了一整天的时间试图通过查看 Maven 文档和类似的帖子来研究这个问题,但我仍然卡住了。这是我关于 stackoverflow 的第一个问题,所以希望我已经很好地遵循了这里的礼仪。谢谢你的帮助!
我的项目结构如下:
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-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>
子阿尔法 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>
儿童-dep-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-parent pom.xml:http: //maven2.my-own-repo.com/acme/acme-parent/1/acme-parent-1。绒球
我们在自己的仓库中没有父 pom.xml 的原因是我们在创建版本控制分支时使用了一个脚本,该脚本会根据我们所在的分支更改 acme-parent pom.xml 中的某些值,所以将 pom.xml 放在 repo 中并为我们尝试与我们的持续集成服务器同时构建的所有不同分支正确更新它会很复杂。
在 Maven 2 中,当构建 child-alpha 时,Maven 可以轻松找到 acme-parent pom.xml 一个目录,即相对路径为 ../pom.xml,因此它永远不会尝试访问我的存储库找到它。仅在我的本地结帐中拥有父 pom.xml 而在 repo 中没有它在 Maven 2 中运行良好。
但是,当我尝试在 Maven 3.0.4 下构建 child-alpha 时,出现了上述异常。起初,我以为我需要在 child-alpha 的 pom.xml 顶部的标签中显式设置 relativePath,但这并没有解决它——而且 acme-parent 的 pom.xml 确实已经在默认的 relativePath 中../pom.xml,因此无需显式设置。
然后,我尝试在 child-alpha 的 pom.xml 部分中注释掉 child-dep-jdk15 依赖项。child-alpha maven 构建成功完成,此依赖项已注释掉。
我不明白当 child-dep-jdk15 依赖项到位时,为什么 child-alpha 不会在 Maven 3 中构建。如果 Maven 最初能够正确找到 acme-parent pom.xml(根据顶部的块),为什么现在在处理 child-dep-jdk15 依赖项时尝试从 repos 下载它?我是否配置错误,如果是,我应该如何修复它?
另一件事:如果我首先mvn -N install
在与 acme-parent 的 pom.xml 相同的目录中运行,然后尝试构建 child-alpha,那么 child-alpha 构建成功,即使在代码中保留依赖项 child-dep-jdk15 也是如此。运行该命令后,我可以验证 acme-parent-1.pom 是否在我的本地 .m2 目录中。虽然这种解决方法对于个人开发人员来说可能没问题,但对于我们的持续集成服务器来说却是一个问题,它需要能够为不同的分支运行并发构建。
由于我上面提到的版本控制分支更改,我强烈希望不必重新配置我的存储库来托管 acme-parent pom.xml。