将阶段添加到maven生命周期?

时间:2016-04-14 08:35:47

标签: maven maven-plugin 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,那么测试级别&#34;到&#34;默认&#34;阶段执行两次。

发出的警告是:

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

发出此警告的source code表示生命周期未正确命名空间。但我无法弄清楚这是怎么做的。

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

网络上有关此主题的所有其他内容似乎至少已有4年......

所以:

  • 如何在maven默认生命周期中添加其他阶段(如果我必须重复默认的插件映射:我可以使用它)
  • 如何命名新的生命周期?我似乎创建了自己的包装(在配置中引用为role-hint)。但是maven仍有一些回退到默认生命周期。
  • 是否可以重复使用默认的maven阶段?

test plugin is on github的当前状态。

谢谢!

3 个答案:

答案 0 :(得分:2)

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

答案 1 :(得分:1)

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

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

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

优点:

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

缺点:

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

请参阅this blog post进行演练。然后,您需要运行mvn install,而不是运行mvn custom_install。您可能可以更进一步,定义自己的自定义包装类型

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

这可能是最接近您所采用的方法。有关示例,请参见this blog post

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

优点:

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

缺点:

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

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

如果您希望对这些测试在生命周期中的确切时间失去控制,则可以将新插件的执行绑定到默认生命周期。我只是在寻找如何执行此操作,并遇到了this blog post描述解决方案的情况。

优点:

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

缺点:

  • 无法定义自定义生命周期阶段
  • 比选项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时,执行是构建过程的一部分。

答案 2 :(得分:0)

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

在模块之间添加依赖性,因此在开始构建Maven之后,将生成模块图并按预期顺序逐一构建。