提问者:小点点

向maven生命周期添加阶段?


我尝试在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-生命周期-maven-plugin我用于测试的pom位于src/it文件夹中。

看起来新的阶段或有所回升,但有一些奇怪的事情正在发生:

mvn post-application-test

这行得通。我为测试添加的回显插件也被执行了。但是有一些警告(使用maven 3.3.9)。

mvn install

跳过新阶段执行默认生命周期。

如果我将生命周期的id fomr“test-level”更改为“default”,则阶段将执行两次。

发出的警告是:

[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阶段(Stackoverflow)或其他插件,如maven-scm-发布插件或docker-maven-plugin。但这些要么是创建一个完整的新生命周期,要么只是更改默认maven生命周期的插件映射。

网上关于这个话题的所有其他东西似乎都至少有4年了…

所以:

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

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

谢谢!


共3个答案

匿名用户

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

方案1-新建插件,为标准打包自定义生命周期

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

优点:

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

缺点:

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

参考这篇博文来走查。然后,您需要运行mvn install而不是运行mvncustom_install。您可能可以更进一步,定义自己的自定义打包类型

方案2-新建插件,自定义打包类型,并定义默认生命周期

这可能是最接近你所采取的方法。例如,请参阅此博客文章。

如果你采用这种方法,你的项目只需要声明

优点:

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

缺点:

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

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

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

优点:

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

缺点:

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

本质上,你所要做的就是定义一个新的插件执行,并在执行id前面加上default-。这是我刚刚用Maven FailsafPlugin做的一个例子,将集成测试验证目标添加到带有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清洁安装时,执行作为构建过程的一部分发生。

匿名用户

你可以看看mvn-finisher插件,它增加了在maven构建端上调用的几个阶段(用于成功、失败和中断)

匿名用户

  • 如果需要,您可以添加生命周期和阶段。
  • 但推荐的方法是:
    • 您已经有了一个定义良好的build生命周期,其中24个阶段
    • 如果您在maven repo上找不到它,请实现您的自定义插件并将其绑定到最合适的任何阶段
    • 这样很容易维护,因为每个开发人员都已经与默认阶段保持一致,如果您在任何特定阶段添加了更多插件执行,那么很容易理解您想做什么。

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