Flatten插件:解决对Bom的依赖性管理,不继承

时间:2019-11-13 15:32:51

标签: maven flatten-maven-plugin

我为此问题创建了一个示例项目:https://github.com/robeatoz/flatten-resolve-dependency-management-without-inherited

给出以下项目结构:

  • foo-build 作为所有模块的父级
  • foo-module-a 作为子模块
  • foo-module-b 作为子模块
  • foo-module-c 作为子模块
  • foo-dependencies 作为Bom

我在所有模块中都使用了flatten-maven-plugin和属性revision来进行CI友好构建:

<groupId>stack.overflow</groupId>
<artifactId>foo-build</artifactId>
<version>${revision}</version>
<packaging>pom</packaging>

<properties>
    <revision>0.1-SNAPSHOT</revision>
</properties>

父级(foo-build)管理一个外部依赖项:

<dependencyManagement>
    <dependencies>
        <dependency>
            <groupId>external.artifact</groupId>
            <artifactId>module-managed-in-parent</artifactId>
            <version>1.2.3</version>
        </dependency>
    </dependencies>
</dependencyManagement>

bom(foo依赖关系)管理foo依赖关系:

<dependencyManagement>
    <dependencies>
        <dependency>
            <groupId>stack.overflow</groupId>
            <artifactId>foo-module-a</artifactId>
            <version>${revision}</version>
        </dependency>
        <dependency>
            <groupId>stack.overflow</groupId>
            <artifactId>foo-module-b</artifactId>
            <version>${revision}</version>
        </dependency>
        <dependency>
            <groupId>stack.overflow</groupId>
            <artifactId>foo-module-c</artifactId>
            <version>${revision}</version>
        </dependency>
    </dependencies>
</dependencyManagement>

我希望Bom的平整pom仅包含已解析的foo依赖关系,而不包含由父级(foo-build)管理的依赖关系,如下所示:

<dependencyManagement>
    <dependencies>
        <dependency>
            <groupId>stack.overflow</groupId>
            <artifactId>foo-module-a</artifactId>
            <version>0.1-SNAPSHOT</version>
        </dependency>
        <dependency>
            <groupId>stack.overflow</groupId>
            <artifactId>foo-module-b</artifactId>
            <version>0.1-SNAPSHOT</version>
        </dependency>
        <dependency>
            <groupId>stack.overflow</groupId>
            <artifactId>foo-module-c</artifactId>
            <version>0.1-SNAPSHOT</version>
        </dependency>
    </dependencies>
</dependencyManagement>

您必须如何配置flatten-maven-plugin来实现此目的?

我已经尝试过<flattenMode>bom</flattenMode>,但是扁平化的pom无法解析版本:

<dependencyManagement>
  <dependencies>
    <dependency>
      <groupId>stack.overflow</groupId>
      <artifactId>foo-module-a</artifactId>
      <version>${revision}</version>
    </dependency>
    <dependency>
      <groupId>stack.overflow</groupId>
      <artifactId>foo-module-b</artifactId>
      <version>${revision}</version>
    </dependency>
    <dependency>
      <groupId>stack.overflow</groupId>
      <artifactId>foo-module-c</artifactId>
      <version>${revision}</version>
    </dependency>
  </dependencies>
</dependencyManagement>

具有以下配置

<pomElements>
    <properties>remove</properties>
    <dependencyManagement>resolve</dependencyManagement>
</pomElements>

扁平化的pom包含父级的托管依赖项

<dependencyManagement>
  <dependencies>
    <dependency>
      <groupId>stack.overflow</groupId>
      <artifactId>foo-module-a</artifactId>
      <version>0.1-SNAPSHOT</version>
    </dependency>
    <dependency>
      <groupId>stack.overflow</groupId>
      <artifactId>foo-module-b</artifactId>
      <version>0.1-SNAPSHOT</version>
    </dependency>
    <dependency>
      <groupId>stack.overflow</groupId>
      <artifactId>foo-module-c</artifactId>
      <version>0.1-SNAPSHOT</version>
    </dependency>
    <dependency>
      <groupId>external.artifact</groupId>
      <artifactId>module-managed-in-parent</artifactId>
      <version>1.2.3</version>
    </dependency>
  </dependencies>
</dependencyManagement>

1 个答案:

答案 0 :(得分:0)

将您的方法更改为以以客户为中心的方式更简单:

  1. foo-dependencies 设为根项目(./pom.xml)。

    • 依赖项管理部分中只有foo-*个依赖项
    • 带有单个 foo-build 模块的
    • 模块列表(将被扁平化插件截断)
    • 通用项目属性(将被扁平化插件截断)
  2. foo-build 设为一个中间项目(./foo-build/pom.xml)。

    • 在依赖性管理部分中具有第三方依赖性
    • 具有项目需要的特定于构建的属性或配置文件(如果有)
  3. 保留 foo-module-* 叶子模块,并以 foo-build 作为父级

如果您坚持简单的项目结构(./foo-module-*/pom.xml),则可以使用relativePath指向父模块,例如:

<parent>
    <groupId>stack.overflow</groupId>
    <artifactId>foo-build</artifactId>
    <version>${revision}</version>
    <relativePath>../foo-build/pom.xml</relativePath>
</parent>

<artifactId>foo-module-a</artifactId>

这样您将收到:

  • 根据需要清除 foo-dependencies
  • foo-*依赖项的零复制粘贴;
  • foo-build 中构建所需内容的灵活性,而不会产生 foo-dependencies 的副作用(无论现在还是将来)。