【问题标题】:Flatten Plugin: Resolve dependencyManagement of bom without inheritedFlatten Plugin:解决bom的依赖管理不继承
【发布时间】:2019-11-13 15:32:51
【问题描述】:

我为这个问题创建了一个示例项目: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-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 来实现这个?

我已经尝试过&lt;flattenMode&gt;bom&lt;/flattenMode&gt;,但是扁平化的 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>

【问题讨论】:

    标签: maven flatten-maven-plugin


    【解决方案1】:

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

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

      • 在依赖管理部分中只有 foo-* 依赖
      • 带有单个 foo-build 模块的模块列表(会被 flatten 插件截断)
      • 通用项目属性(会被 flatten 插件截断)
    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 产生副作用(现在和将来都不会)。

    【讨论】:

    • 感谢您的建议!对于给定的示例,您的解决方案非常好。在我的实际项目中,根项目以spring-boot-parent 作为父项目,并拥有自己的依赖管理。出于这个原因,将foo-dependencies 作为根项目很遗憾没有帮助。如果没有其他人回答,我无论如何都会给你赏金:)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-08-04
    • 1970-01-01
    • 2019-10-16
    • 2018-04-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多