【问题标题】:dependencyManagement in parent ignored父项中的依赖项管理被忽略
【发布时间】:2014-01-17 17:32:11
【问题描述】:

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

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

【问题讨论】:

标签: maven dependencies maven-3


【解决方案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 的依赖项。

【讨论】:

    【解决方案2】:

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

    【讨论】:

    • 感谢您的回复!依赖插件规范是否必须在任何使用 P1、P1-PARENT 或 P1 本身的项目中使用?
    • 我会将 maven-dependency-plugin 2.8 包含在最上层父级的 pluginManagement 中,所以你可以使用mvn dependency:tree
    • 谢谢。另一个团队已经离开了一天,所以我还不能测试这个。明天将进行测试,如果有效,则标记为正确。
    • 在 maven 3.2.3 中遇到了同样的问题。还设置了一个小示例项目来重现所描述的情况。使用 maven-dependency-plugin 2.8 并没有改变任何东西。还验证了这不仅是dependency:tree 的问题,而且传递依赖的错误版本最终会出现在最终的工件中(例如战争)。还有其他人对此有想法吗?
    猜你喜欢
    • 2016-09-07
    • 1970-01-01
    • 2017-12-02
    • 2010-11-05
    • 2015-04-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多