14

我尝试在 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

这行得通。我为测试添加的回声插件也被执行。但是有一些警告(使用 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
....

发出此警告的源代码表明生命周期未正确命名空间。但我无法弄清楚这是如何做到的。

我在网上找到了一些提示:create-a-new-phase (Stackoverflow) 或其他插件,如maven-scm-publish-plugindocker-maven-plugin。但是那些要么创建一个完整的新生命周期,要么只是从默认的 Maven 生命周期更改插件映射。

网络上有关此主题的所有其他内容似乎至少有 4 年历史了……

所以:

  • 如何向 Maven 默认生命周期添加其他阶段(如果我必须重复默认插件映射:我可以忍受)
  • 如何命名新的生命周期?似乎我创建了自己的包装(在配置中被称为角色提示)。但是 Maven 仍然有一些回退到默认生命周期。
  • 可以不重复使用默认的 Maven 阶段吗?

测试插件的当前状态在 github 上

谢谢!

4

4 回答 4

2

您可以看一下mvn-finisher 插件,它添加了几个要在 maven 构建结束时调用的阶段(用于成功、失败和中断)

于 2020-02-10T05:30:09.090 回答
2

我不确定是否可以修改开箱即用包装类型的默认生命周期,但还有其他选择。您可以采用定义自己的插件的方法(带有或不带有自定义打包类型),或者您可以简单地在默认生命周期中添加一些额外的测试执行。

选项 1 - 为标准打包创建具有自定义生命周期的新插件

使用这种方法,您可以定义一个全新的生命周期并明确指定阶段。

优点:

  • 完全控制所有阶段以及这些阶段的插件绑定
  • 比选项 3 更干燥,如果您发现自己在多个不相关的项目中做同样的事情

缺点:

  • 需要维护插件代码。
  • IDE 集成有点困难,因为它需要执行非标准阶段。

有关演练,请参阅此博客文章。然后,mvn install您需要运行而不是运行mvn custom_install。您可能会更进一步并定义您自己的自定义包装类型

选项 2 - 创建具有自定义打包类型的新插件,并定义默认生命周期

这可能是最接近您采用的方法。有关示例,请参阅此博客文章。

<packaging>my-custom-packaging</packaging>如果您采用这种方法,您的项目除了添加插件之外只需要声明<extensions>true</extensions>.

优点:

  • 完全控制所有阶段以及这些阶段的插件绑定
  • 比选项 3 更干燥,如果您发现自己在多个不相关的项目中做同样的事情
  • 可能比选项 1 更容易与您的 IDE 集成

缺点:

  • 需要维护插件代码
  • 如果您想支持多种打包类型(jarwarear等),您需要在插件中定义每种打包类型的自定义版本。

选项 3 - 将插件执行添加到默认生命周期

如果您愿意对这些测试在生命周期中运行的确切时间失去一点控制,您可以简单地将新插件执行绑定到默认生命周期。我只是在寻找如何做到这一点,并浏览了这篇描述解决方案的博客文章。

优点:

  • 最容易实施
  • 无需维护插件代码

缺点:

  • 无法定义自定义生命周期阶段
  • 比选项 1 和 2 更干燥

本质上,您所要做的就是定义一个新的插件执行,并在执行 ID 前加上default-. 这是我刚刚使用Maven Failsafe Pluginintegration-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时,执行是构建过程的一部分。

于 2018-10-16T01:48:02.217 回答
0

通常在您需要额外构建阶段的情况下 - 这是您需要拆分代码并将其中一部分移动到专用于单独功能的额外 maven 模块的信号。

添加模块之间的依赖关系,因此在开始构建 Maven 模块构建图并按预期顺序构建它们后,结果是一个接一个。

于 2018-07-31T19:51:14.807 回答
0
  • 如果需要,您可以添加生命周期和阶段。
  • 但推荐的方法是:
    • 您已经有了一个明确定义的build生命周期24 phases
    • custom plugin如果您在 maven repo 上找不到它,请实施您的并将其绑定到任何phase最合适的。
    • 这种方式很容易维护,因为每个开发人员都已经与默认阶段保持一致,如果您在任何特定阶段添加了更多插件执行,很容易理解您想要做什么。

当然,您可以根据需要使项目变得复杂,但通常认为添加生命周期和阶段是不好的做法,直到您在构建生命周期的上下文中没有非常大的事情要管理。

于 2022-02-22T03:48:39.827 回答