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



Maven正在过渡地引入番石榴的版本16,尽管我有一个<dependencyManagement>指定版本18的部分。

快速总结:

  • gwizard-example依赖于gwizard-config
  • gwizard-config有一个父pom,gwizard-parent
  • CCD_ 5具有<dependencyManagement>它规定了番石榴的版本18

值得庆幸的是,这是一个开源项目,所以您可以直接看到poms:gwizardparent、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示例中声明的无装饰依赖:

<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的依赖树正确显示了guava 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示例的依赖树显示了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

更新:github上链接的pom正在更改;在gwizard-example中添加对gwizard-services的依赖(它直接声明了一个番石榴dep)"修复"了这个问题。这里仍然存在一些不良的潜在行为。

更新:创建了此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文档中的bom

下面是另一个博客,它解释了bom的用法。

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

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

最新更新