Maven dependencyManagement版本在传递依赖中被忽略

尽管我有一个指定版本18的<dependencyManagement>部分,但Maven正在传递拉伸番石榴版本16。

快速总结:

  • gwizard-example取决于gwizard-config
  • gwizard-config有一个父pom, gwizard-parent
  • gwizard-parent具有指定番石榴版本18的<dependencyManagement>
  • 谢天谢地,这是一个开源项目,所以你可以直接看到poms:gwizard-parent,gwizard-config,gwizard-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的依赖关系树显示番石榴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

    更新 :github上链接的poms正在改变; 向gwizard-services (它直接声明一个番石榴dep)添加一个依赖项,以gwizard-example “固定”这个问题。 这里仍然存在某种不良的潜在行为。

    更新 :创建了这个JIRA问题


    有一件简单的事情。 一个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检查。


    在这种情况下,Maven不解决版本传递依赖性问题。

    这个问题可以通过使用maven bom的概念来使用。

    在下面的链接中查看maven的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>
    
    链接地址: http://www.djcxy.com/p/29691.html

    上一篇: Maven dependencyManagement version ignored in transitive dependencies

    下一篇: Maven: best way of linking custom external JAR to my project?