首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >向maven生命周期添加阶段?

向maven生命周期添加阶段?
EN

Stack Overflow用户
提问于 2016-04-14 08:35:46
回答 4查看 7.4K关注 0票数 15

我试图在maven生命周期中添加一些额外的阶段。主要是增加一些额外的测试级别:

代码语言:javascript
复制
<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>

上面包含了新的应用程序测试和系统测试阶段(包括前后)。

我已经在:代码动物园-生命周期-maven-plugin上启动了一个测试插件,用于测试的pom位于src/it文件夹中。

似乎是新的阶段,或有所回升,但有一些奇怪的事情正在进行:

代码语言:javascript
复制
mvn post-application-test

这个很管用。另外,我为测试添加的echo插件也会被执行。但是有一些警告(使用maven 3.3.9)。

代码语言:javascript
复制
mvn install

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

如果我将生命周期的id fomr“测试级别”更改为“默认”,则阶段将执行两次。

发出的警告如下:

代码语言:javascript
复制
[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
....

发出此警告的源代码表示生命周期没有正确的命名空间。但我不知道是怎么做到的。

我在网络上找到了一些提示:创造一个新的阶段 (堆栈溢出)或其他插件,如maven-scm-发布插件docker-maven-插件。但它们要么创建了一个完整的新生命周期,要么只是改变了默认maven生命周期中的插件映射。

网络上所有关于这个话题的东西似乎至少有4岁了.

所以:

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

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

谢谢!

EN

回答 4

Stack Overflow用户

发布于 2018-10-16 01:48:02

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

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

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

优点:

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

缺点:

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

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

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

这个可能是最接近你所采取的方法。有关示例,请参见这篇博客文章

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

优点:

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

缺点:

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

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

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

优点:

  • 最容易实现
  • 没有需要维护的插件代码

缺点:

  • 无法定义自定义生命周期阶段
  • 比备选方案1和2少干

本质上,您所要做的就是定义一个新的插件执行,并在执行id前面加上default-。下面是我使用Maven故障安全插件integration-testverify目标添加到带有jar打包的项目的默认生命周期中的一个示例:

代码语言:javascript
复制
<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
EN

Stack Overflow用户

发布于 2020-02-10 05:30:09

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

票数 2
EN

Stack Overflow用户

发布于 2022-02-22 03:48:39

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

当然,您可以使您的项目像您想要的那样复杂,但是通常,添加生命周期和阶段被认为是错误的做法,直到您在构建生命周期的上下文中没有非常大的事情可管理。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/36617759

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档