簡體   English   中英

Flatten Plugin:解決bom不繼承的依賴管理

[英]Flatten Plugin: Resolve dependencyManagement of bom without inherited

我為這個問題創建了一個示例項目: 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 和 CI 友好構建的屬性revision

<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>

將您的方法更改為更加以客戶為中心會更簡單:

  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 依賴項產生副作用(現在和將來都不會)。

我喜歡完全相同的用例,並使用以下配置解決了它。

您需要在 BOM 模塊的 pom 文件中對 flatten-plugin 應用非常具體的配置:

<plugin>
    <groupId>org.codehaus.mojo</groupId>
    <artifactId>flatten-maven-plugin</artifactId>
    <configuration>
        <updatePomFile>true</updatePomFile>
        <pomElements>
            <dependencyManagement>expand</dependencyManagement>
        </pomElements>
    </configuration>
</plugin>

expand意味着 dependencyManagement 塊將替換為來自有效 pom的塊,其中所有引用都已正確解析。 updatePomFile是必需的,否則默認情況下,不會為帶有<packaging>pom</packaging>的 poms 發布扁平化的 pom

以下是 flatten-plugin 文檔中的相關部分:

不需要用${revision}改版本,用${project.version}試試

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM