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

sti*_*ure 22 maven-3 maven

虽然我有一个指定版本18的<dependencyManagement>部分,但是Maven正在转移guava版本16.

快速摘要:

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

值得庆幸的是这是一个开源项目,所以你可以直接看到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>
Run Code Online (Sandbox Code Playgroud)

...和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>
Run Code Online (Sandbox Code Playgroud)

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
Run Code Online (Sandbox Code Playgroud)

但是,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
Run Code Online (Sandbox Code Playgroud)

这是使用Maven v3.2.5.我很困惑.救命?

可能相关:父母中的dependencyManagement被忽略

更新:github上链接的poms正在改变; gwizard-servicesgwizard-example"修复"问题中添加一个依赖(直接声明一个guava dep).这里仍然存在某种不良的潜在行为.

更新:创建此JIRA问题

khm*_*ise 9

有一件简单的事情.A 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>
Run Code Online (Sandbox Code Playgroud)

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

<dependencies>
    <dependency>
        <groupId>com.google.guava</groupId>
        <artifactId>guava</artifactId>
    </dependency>
</dependencies>
Run Code Online (Sandbox Code Playgroud)

如果您已添加此项,请稍后通过mvn dependency:tree.

  • 这没有意义; 或者至少,它似乎没有用.`dependencyManagement`的要点是允许我为传递依赖指定一个版本.在这里,番石榴正在通过guice传递.为什么我的`dependencyManagement`不能控制guice引入的版本?如果我的库不直接依赖番石榴,我为什么要指定guava作为依赖? (5认同)
  • 对此的简单答案是,因为 guice pom 的维护者决定使用其他版本。所以你不能直接控制那里使用的pom。你只能间接地控制它。顺便说一句:“dependencyManagement”不控制。相反,“依赖项”会这样做,因为它更接近您的项目。 (2认同)