传递依赖项中忽略了Maven dependencyManagement版本

时间:2015-02-04 03:23:18

标签: maven maven-3

即使我有一个< dependencyManagement>,Maven仍在传递番石榴版本16。指定版本18的部分。

快速摘要:

  • gwizard-example取决于gwizard-config
  • gwizard-config有一个父pom,gwizard-parent
  • gwizard-parent有< dependencyManagement>它指定了番石榴版本18

谢天谢地,这是一个开源项目,所以你可以直接看到poms:gwizard-parentgwizard-configgwizard-example。但是,这是gwizard-parent中的重要部分:

<properties>
    <guava.version>18.0</guava.version>
</properties>

<dependencyManagement>
    <dependencies>
        <dependency>
            <groupId>com.google.guava</groupId>
            <artifactId>guava</artifactId>
            <version>${guava.version}</version>
        </dependency>
    </dependencies>
</dependencyManagement>

...和gwizard-example中声明的简单依赖:

<properties>
    <gwizard.version>0.5</gwizard.version>
</properties>

<dependencies>
    <dependency>
        <groupId>org.gwizard</groupId>
        <artifactId>gwizard-config</artifactId>
        <version>${gwizard.version}</version>
    </dependency>
</dependencies>

gwizard-config的依赖关系树正确显示了番石榴18:

[INFO] --- maven-dependency-plugin:2.8:tree (default-cli) @ gwizard-config ---
[INFO] org.gwizard:gwizard-config:jar:0.5
[INFO] +- com.google.inject:guice:jar:4.0-beta5:compile
[INFO] |  \- com.google.guava:guava:jar:18.0:compile

然而,gwizard-example的依赖树显示了guava 16(导致问题):

[INFO] --- maven-dependency-plugin:2.8:tree (default-cli) @ gwizard-example ---
[INFO] org.gwizard:gwizard-example:jar:1.0-SNAPSHOT
[INFO] +- org.gwizard:gwizard-config:jar:0.5:compile
[INFO] |  +- com.google.inject:guice:jar:4.0-beta5:compile
[INFO] |  |  \- com.google.guava:guava:jar:16.0.1:compile

这是使用Maven v3.2.5。我很困惑。帮助

可能相关:dependencyManagement in parent ignored

UPDATE :github上链接的poms正在发生变化;在gwizard-services中添加了对gwizard-example(直接声明guava dep)的依赖关系“修复了”问题。这里仍然存在某种不良的潜在行为。

更新:创建了this JIRA issue

2 个答案:

答案 0 :(得分:9)

有一件简单的事情。 dependencyManagement未声明真正使用的依赖关系,它仅定义可以使用的版本等。

如果您定义类似的内容,则不会导致更改。

<properties>
    <guava.version>18.0</guava.version>
</properties>

<dependencyManagement>
    <dependencies>
        <dependency>
            <groupId>com.google.guava</groupId>
            <artifactId>guava</artifactId>
            <version>${guava.version}</version>
        </dependency>
    </dependencies>
</dependencyManagement>

如果你真的想覆盖你树中使用的版本,你需要定义一个真正的依赖: 因此,基于上面的定义,您还需要添加以下内容:

<dependencies>
    <dependency>
        <groupId>com.google.guava</groupId>
        <artifactId>guava</artifactId>
    </dependency>
</dependencies>

如果您已添加此内容,请稍后通过mvn dependency:tree进行检查。

答案 1 :(得分:0)

在这种情况下,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/

在您解决此问题的情况下,您需要在项目gwizard-example的dependencyManagement部分中添加以下依赖项。

     <dependency>
         <groupId>org.gwizard</groupId>
         <artifactId>gwizard-parent</artifactId>
         <version>${gwizard.version}</version>
         <type>pom</type>
         <scope>import</scope>
     </dependency>