簡體   English   中英

向 maven 生命周期添加階段?

[英]Adding phases to the maven lifecycle?

我嘗試向 maven 生命周期添加一些額外的階段。 主要是增加一些額外的測試關卡:

<phases>
    <phase>initialize</phase>
    <phase>process-resources</phase>
    <phase>compile</phase>
    <phase>process-test-resources</phase>
    <phase>test-compile</phase>
    <phase>test</phase>
    <phase>prepare-package</phase>
    <phase>package</phase>
    <phase>pre-integration-test</phase>
    <phase>integration-test</phase>
    <phase>post-integration-test</phase>
    <phase>pre-application-test</phase>
    <phase>application-test</phase>
    <phase>post-application-test</phase>
    <phase>pre-system-test</phase>
    <phase>system-test</phase>
    <phase>post-system-test</phase>
    <phase>finalize-tests</phase>
    <phase>install</phase>
    <phase>deploy</phase>
</phases>

以上包含新的應用程序測試和系統測試階段(包括前和后)。

我已經在以下位置啟動了一個測試插件: codezoo-lifecycle-maven-plugin我用於測試的 pom 在src/it文件夾中。

似乎新階段或有所回升,但發生了一些奇怪的事情:

mvn post-application-test

這行得通。 我為測試添加的 echo 插件也被執行。 但是有一些警告(使用maven 3.3.9)。

mvn install

跳過新階段執行默認生命周期。

如果我將生命周期的 ID 從“測試級別”更改為“默認”,則階段將執行兩次。

發出的警告是:

[WARNING] Duplicated lifecycle phase package. Defined in default but also in test-levels
[WARNING] Duplicated lifecycle phase pre-integration-test. Defined in default but also in test-levels
[WARNING] Duplicated lifecycle phase integration-test. Defined in default but also in test-levels
....

發出此警告的源代碼表明生命周期的命名空間不正確。 但我不知道這是怎么做到的。

我在 web: create-a-new-phase (Stackoverflow) 或其他插件如maven-scm-publish-plugindocker-maven-plugin中發現了一些提示。 但是那些要么創建一個完整的新生命周期,要么只是更改默認 maven 生命周期的插件映射。

web 上關於此主題的所有其他內容似乎至少已有 4 年歷史了......

所以:

  • 如何向 maven 默認生命周期添加其他階段(如果我必須重復默認插件映射:我可以接受)
  • 我如何命名新的生命周期? 看來我創建了自己的包裝(在配置中被稱為角色提示)。 但是 maven 仍然有一些回退到默認生命周期。
  • 默認的 maven 相位不能重復使用嗎?

測試插件當前的state在github上

謝謝!

我不確定是否可以修改開箱即用包裝類型的默認生命周期,但有其他選擇。 您可以采用定義自己的插件的方法(使用或不使用自定義打包類型),或者您可以簡單地向默認生命周期添加一些額外的測試執行。

選項 1 - 為標准包裝創建一個具有自定義生命周期的新插件

使用這種方法,您可以定義一個全新的生命周期並明確指定階段。

優點:

  • 完全控制所有階段以及這些階段的插件綁定
  • 比選項 3 更 DRY,如果你發現自己在多個不相關的項目中做同樣的事情

缺點:

  • 需要維護插件代碼。
  • IDE 集成有點困難,因為它需要執行非標准階段。

有關演練,請參閱此博客文章 然后,您需要運行mvn custom_install而不是運行mvn install 您可能可以更進一步並定義您自己的自定義包裝類型

選項 2 - 使用自定義打包類型創建一個新插件,並定義默認生命周期

這可能是最接近您采取的方法的方法。 有關示例,請參閱此博客文章

如果你采用這種方法,你的項目只需要聲明<packaging>my-custom-packaging</packaging>除了添加帶有<extensions>true</extensions>插件。

優點:

  • 完全控制所有階段以及這些階段的插件綁定
  • 比選項 3 更 DRY,如果你發現自己在多個不相關的項目中做同樣的事情
  • 可能比選項 1 更容易與您的 IDE 集成

缺點:

  • 需要維護插件代碼
  • 如果您想支持多種打包類型( jarwarear等),您需要在插件中定義每種打包類型的自定義版本。

選項 3 - 將插件執行添加到默認生命周期

如果您願意在這些測試運行的生命周期中的確切時間失去一些控制,您可以簡單地將新插件執行綁定到默認生命周期。 我只是在尋找如何做到這一點並瀏覽了這篇描述解決方案的博客文章

優點:

  • 最容易實施
  • 無需維護插件代碼

缺點:

  • 無法定義自定義生命周期階段
  • 比選項 1 和 2 少干

本質上,您所要做的就是定義一個新的插件執行,並在執行 ID 前加上default- 這是我剛剛使用Maven Failsafe Plugin完成的一個示例,用於將integration-testverify目標添加到帶有jar包裝的項目的默認生命周期中:

<plugin>
  <groupId>org.apache.maven.plugins</groupId>
  <artifactId>maven-failsafe-plugin</artifactId>
  <version>2.22.1</version>
  <executions>
    <execution>
      <id>default-system-test</id>
      <goals>
        <goal>integration-test</goal>
        <goal>verify</goal>
      </goals>
    </execution>
  </executions>
</plugin>

當我運行mvn clean install ,執行作為構建過程的一部分發生。

可以看一下mvn-finisher插件,里面增加了maven build end調用的幾個階段(成功,失敗,中斷)

  • 如果需要,您可以添加生命周期和階段。
  • 但推薦的方法是:
    • 您已經擁有一個明確定義的包含24 phasesbuild生命周期
    • 如果您在 maven 存儲庫中找不到custom plugin ,請實施您的自定義插件並將其綁定到最合適的任何phase
    • 這種方式很容易維護,因為每個開發人員都已經與默認階段保持一致,如果您向任何特定階段添加了更多插件執行,很容易理解您想要做什么。

當然,您可以根據需要使項目變得盡可能復雜,但通常認為添加生命周期和階段是不好的做法,直到您在構建生命周期的上下文中沒有非常大的事情要管理。

通常在您需要額外構建階段的情況下 - 這是您需要拆分代碼並將其一部分移動到專用於單獨功能的其他 maven 模塊的信號。

添加模塊之間的依賴關系,因此在開始構建Maven構建模塊圖后的結果並按照預期順序構建它們,一一。

暫無
暫無

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

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