4

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

给出以下项目结构:

  • foo-build作为所有模块的父级
  • foo-module-a作为子模块
  • foo-module-b作为子模块
  • foo-module-c作为子模块
  • 作为 bom的 foo 依赖项

我在所有模块中使用了 flatten-maven-plugin 和revisionCI 友好构建的属性:

<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-dependencies) 管理 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>
4

1 回答 1

1

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

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

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

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

如果您坚持使用简单的项目结构(./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 依赖项
  • foo-*依赖项的零复制粘贴;
  • 灵活地在foo-build中构建任何你喜欢的东西,而不会对foo 依赖项产生副作用(现在和将来都不会)。
于 2019-11-19T00:23:56.187 回答