我有一个项目,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并且它没有不包括“(版本管理...”位)。另外,像我的项目一样,他们对ZooKeeper(传递或其他)的唯一依赖是通过P1(依赖验证:树和grep)。问题是, 为什么。当它们包含P1时,在确定P1的传递依赖性时,不应该看看P1的父POM吗?
我正在使用Maven 3.0.5。他们正在使用版本3.0.3和3.1.1,并看到这两个版本的问题。
答案 0 :(得分:2)
在这种情况下,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的依赖项。
答案 1 :(得分:0)
使用Maven3时,请确保使用正确版本的maven-dependency-plugin
,并通过其完全限定名称org.apache.maven.plugins:maven-dependency-plugin:2.8:tree
调用它。 IIRC高达2.6给出了错误的树。在这种情况下,建议是:将项目作为“mvn validate -X”运行,以查看由Aether(Maven的依赖管理框架)解析的树。