如何通过父pom中的dependencyManagement强制maven依赖版本?

Posted

技术标签:

【中文标题】如何通过父pom中的dependencyManagement强制maven依赖版本?【英文标题】:How to force maven dependency version via dependencyManagement in parent pom? 【发布时间】:2020-08-22 09:00:23 【问题描述】:

假设B:1.0.1 具有传递依赖关系A:1.0.1,但子项目应该依赖于A:1.0.2(有意覆盖传递依赖关系)。

很容易发现<dependencyManagement> 中的依赖顺序会影响版本覆盖,因此在B:1.0.1 之前的子pom 中添加A:1.0.2 将强制使用A:1.0.2,即使作为B:1.0.1 的依赖。

在这种情况下,我正在寻找一种在父 pom 中声明 A:1.0.2 并从其所有子代中删除样板的方法。不幸的是,以下设置导致在最终工件中使用这两个版本:A:1.0.1(作为 B:1.0.1 的依赖项出现)和 A:1.0.2(来自父 pom 中的显式声明)。

如何在所有子项目中强制使用版本A:1.0.2,将声明保留在父项目中?

父 pom:

<groupId>my-group</groupId>
<artifactId>my-parent</artifactId>
<version>0.0.1</version>
<packaging>pom</packaging>

<dependencyManagement>
  <dependencies>   
    <dependency>
      <groupId>g</groupId>
      <artifactId>A</artifactId>
      <version>1.0.2</version>
      <type>pom</type>
      <scope>import</scope>
    </dependency>
  </dependencies>
</dependencyManagement>

儿童 pom:

<parent>
  <groupId>my-group</groupId>
  <artifactId>my-parent</artifactId>
  <version>0.0.1</version>
</parent>

<artifactId>my-child</artifactId>
<version>0.0.1</version>
<packaging>jar</packaging>

<dependencies>   
  <dependency>
    <groupId>g</groupId>
    <artifactId>A</artifactId>
    <!-- version 1.0.2 comes from the parent pom -->
  </dependency>
</dependencies>

<dependencyManagement>
  <dependencies>   
    <dependency>
      <groupId>g</groupId>
      <artifactId>B</artifactId>
      <version>1.0.1</version>
      <type>pom</type>
      <scope>import</scope>
    </dependency>
  </dependencies>
</dependencyManagement>

【问题讨论】:

【参考方案1】:

您错误地使用了dependencyManagement。

如果 A 和 B 是 jar 工件,则不应有标签

<type>pom</type>
<scope>import</scope>

这些仅用于 BOM。

【讨论】:

让我们假设类型是适合回答这个问题的任何类型。那么我们如何解决这个版本冲突的问题呢? 在父 POM 依赖管理中为 A 设置版本也会为所有子项目设置版本(当然,除非他们明确设置自己的版本)。

以上是关于如何通过父pom中的dependencyManagement强制maven依赖版本?的主要内容,如果未能解决你的问题,请参考以下文章

在父项目中的根结点中声明dependencyManagement和dependencies的区别

dependencies与dependencyManagement的区别

maven父项目pom.xml文件中的报依赖找不到(dependency not found)红线错误

maven父子工程的pom.xml继承

maven学习

开发遇到的问题---导入别人的工程后,父工程中的pom依赖引入报错