我有一个项目 P1,它创建了一个 jar。该项目有一个父 POM,P1-PARENT。 P1-Parent 包括以下内容:
<dependencyManagement>
<!-- Kafka uses Zookeeper 3.3.4, but Curator requires 3.4.5. To resolve
we specify 3.4.5 so all projects using either Kafka or Curator will
get the later version which is compatible with both projects. -->
<dependency>
<groupId>org.apache.zookeeper</groupId>
<artifactId>zookeeper</artifactId>
<version>3.4.5</version>
</dependency>
<dependency>
<groupId>org.apache.kafka</groupId>
<artifactId>kafka_2.10</artifactId>
<version>0.8.0</version>
</dependency>
<dependency>
<groupId>org.apache.curator</groupId>
<artifactId>curator-client</artifactId>
<version>2.2.0-incubating</version>
</dependency>
<!-- A bunch of other irrelevant stuff here -->
</dependencyManagement>
这有效——“mvn dependency:tree”的输出包括:
[INFO] +- org.apache.kafka:kafka_2.10:jar:0.8.0:compile
[INFO] | +- org.apache.zookeeper:zookeeper:jar:3.4.5:compile (version managed from 3.3.4)
请注意,这是对 zookeeper 的唯一依赖(通过“mvn dependency:tree | grep zoo”验证)。
我还有几个其他项目也继承自 P1-PARENT,一切正常,它们都引入了 ZooKeeper 3.4.5。然而,我的一位同事最近开始在他们的一个项目中使用 P1。他们的项目没有继承自 P1-PARENT。他们从 P1 获得的传递依赖是 ZooKeeper 3.3.4,而不是 3.4.5。我们已经通过“mvn dependency:tree”验证了它们将 zookeeper.3.3.4 作为 Kafka 的传递依赖(例如,输出看起来与我在上面粘贴的相同,但版本是 3.3.4,但它不是't 包括“(版本管理...”位)。另外,就像我的项目一样,它们对 ZooKeeper 的唯一依赖(传递或其他方式)是通过 P1(由 dependency:tree 和 grep 验证)。问题是, 为什么。当它们包含 P1 时,maven 在确定 P1 的传递依赖时不应该查看 P1 的父 POM 吗?
我正在使用 Maven 3.0.5。他们使用的是 3.0.3 和 3.1.1 版本,发现这两个版本都存在问题。
最佳答案
在这种情况下,Maven 没有解决版本传递依赖性问题。
这个问题可以通过使用maven bom概念来使用。
在下面的链接中检查 bom 的 maven 文档 http://maven.apache.org/guides/introduction/introduction-to-dependency-mechanism.html#Dependency_Management
这是另一个博客,它解释了 bom 的用法 http://howtodoinjava.com/maven/maven-bom-bill-of-materials-dependency/
在您的情况下,要解决此问题,您需要在面临问题的其他项目的 dependencyManagement 部分中添加父 pom 的依赖项。
关于maven - 父项中的 dependencyManagement 被忽略,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20846181/