父级中的依赖管理被忽略

Oli*_*ain 5 dependencies maven-3 maven

我有一个项目 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>
Run Code Online (Sandbox Code Playgroud)

这是有效的 - “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)
Run Code Online (Sandbox Code Playgroud)

请注意,这是对 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 (通过依赖项验证:tree 和 grep)。问题是,为什么.当它们包含P1时,maven在确定P1的传递依赖时不应该查看P1的父POM吗?

我正在使用 Maven 3.0.5。他们使用版本 3.0.3 和 3.1.1,并发现这两个版本都存在问题。

Rob*_*lte 0

maven-dependency-plugin使用 Maven3 时,请通过完全限定名称调用它来确保您使用正确的版本: org.apache.maven.plugins:maven-dependency-plugin:2.8:tree。IIRC 到 2.6 给出了错误的树。在这种情况下,建议是:以“mvn validate -X”运行项目,以查看由 Aether(Maven 的依赖管理框架)解析的树。