【问题标题】:Adding phases to the maven lifecycle?向 Maven 生命周期添加阶段?
【发布时间】:2016-08-05 16:36:19
【问题描述】:

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

发出此警告的source code 表示生命周期未正确命名空间。但我不知道这是怎么做到的。

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

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

所以:

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

test plugin is on github 的当前状态。

谢谢!

【问题讨论】:

    标签: maven maven-plugin maven-lifecycle


    【解决方案1】:

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

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

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

    优点:

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

    缺点:

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

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

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

    这可能是最接近您采用的方法。示例见this blog post

    如果你采用这种方法,你的项目只需要声明&lt;packaging&gt;my-custom-packaging&lt;/packaging&gt;,除了用&lt;extensions&gt;true&lt;/extensions&gt;添加你的插件。

    优点:

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

    缺点:

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

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

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

    优点:

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

    缺点:

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

    【讨论】:

    • 感谢您的回复!我已经放弃了希望。正如您所说,选项 2 最接近我想要实现的目标。当时,这意味着要为耳朵、战争、罐子实施一个。但是今天扩展 jar 可能就足够了 - 所以机会更大。我会查看您链接的博客文章。等一下 :)
    【解决方案2】:

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

    【讨论】:

      【解决方案3】:

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

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

      【讨论】:

      • 正如我上面提到的,它主要是为了添加一些额外的测试级别。在那里有更多的结构。我不喜欢将测试源从其代码中移开,并且在多次执行中重复故障保护插件并不能带来我希望为开发人员实现的灵活性水平。
      • 好的,一些单元测试应该与代码在同一个模块中,例如一些针对 Spring 上下文的集成测试 - 也是。但是一些功能测试可以放在另一个单独的模块中
      猜你喜欢
      • 1970-01-01
      • 2013-05-05
      • 2021-01-25
      • 2015-11-20
      • 2016-02-18
      • 1970-01-01
      • 1970-01-01
      • 2019-09-28
      • 2022-11-11
      相关资源
      最近更新 更多