【问题标题】:Run a Maven plugin when the build fails构建失败时运行 Maven 插件
【发布时间】:2017-06-13 03:09:55
【问题描述】:

我正在使用插件通过 Maven 发送 Slack 消息。我想知道是否可以在构建失败时使用插件,以便自动收到有关构建失败的通知?

【问题讨论】:

  • 让你的构建服务器通知你不是更容易吗?
  • @JF Meier 好点,我们将来会这样做。但是,我问的事情不是可能的吗?

标签: maven


【解决方案1】:

您可以通过 Maven 3.0.2 中内置的 EventSpy 机制在 Maven 内部执行此操作。在构建的每个步骤中,Maven 本身或自定义代码都会引发几个事件,并且可以侦听这些事件以执行某些操作。 Maven 引发的执行事件由类ExecutionEvent 表示。每个事件都有a type,它描述了它所代表的事件类型:project failureMojo failureproject skipped 等。在这种情况下,项目失败事件就是您要查找的事件。

事件的自定义间谍只是一个实现EventSpy 接口的Java 类。最好它应该继承自 AbstractEventSpy 助手类。例如,新建一个项目(我们称之为my-spy),并在一个包下添加如下Java类:

import org.apache.maven.eventspy.AbstractEventSpy;
import org.apache.maven.eventspy.EventSpy;
import org.apache.maven.execution.ExecutionEvent;
import org.codehaus.plexus.component.annotations.Component;
import org.codehaus.plexus.component.annotations.Requirement;
import org.codehaus.plexus.logging.Logger;

@Component(role = EventSpy.class)
public class BuildFailureEventSpy extends AbstractEventSpy {

    @Requirement
    private Logger logger;

    @Override
    public void onEvent(Object event) throws Exception {
        if (event instanceof ExecutionEvent) {
            ExecutionEvent executionEvent = (ExecutionEvent) event;
            if (executionEvent.getType() == ExecutionEvent.Type.ProjectFailed) {
                logger.info("My spy detected a build failure, do the necessary here!");
            }
        }
    }

}

此代码只是通过 Plexus 的 @Component 注释注册间谍,并在项目构建失败时记录一条消息。要编译该类,您只需向 my-spy 项目添加对 Maven Core 的依赖项并执行 plexus-component-metadata 插件即可为组件创建正确的 Plexus 元数据。

<dependencies>
  <dependency>
    <groupId>org.apache.maven</groupId>
    <artifactId>maven-core</artifactId>
    <version>3.0.2</version>
  </dependency>
</dependencies>
<build>
  <plugins>
    <plugin>
      <groupId>org.codehaus.plexus</groupId>
      <artifactId>plexus-component-metadata</artifactId>
      <version>1.6</version>
      <executions>
        <execution>
          <goals>
            <goal>generate-metadata</goal>
          </goals>
        </execution>
      </executions>
    </plugin>
  </plugins>
</build>

此项目编译并安装到本地存储库(通过mvn clean install)后,您可以通过core extensions mechanism 将其添加到另一个项目的构建中。

在 Maven 3.3.1 之前,您必须将 my-spy JAR 放到您的 ${MAVEN_HOME}/lib/ext 文件夹中,这样 Maven 才能找到它。从 3.3.1 开始,您不需要摆弄 Maven 安装,并且可以在您的项目基目录 (${maven.multiModuleProjectDirectory}/.mvn/extensions.xml) 中创建一个文件 .mvn/extensions.xml。它的内容是

<?xml version="1.0" encoding="UTF-8"?>
<extensions>
  <extension>
    <groupId>my.spy</groupId>
    <artifactId>my-spy</artifactId>
    <version>0.0.1</version>
  </extension>
</extensions>

它只是声明了一个指向间谍项目的 Maven 坐标的扩展。 Maven (≥ 3.3.1) 默认会查找该文件,因此,您的 spy 将在整个构建过程中正确注册和调用。


剩下的唯一事情就是编写间谍应该做什么。在您的情况下,它应该调用一个 Maven 插件,因此您可以查看 Mojo Executor 库,这很容易做到。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-12-31
    • 1970-01-01
    • 2021-06-27
    • 2011-05-18
    • 1970-01-01
    • 2013-06-08
    • 1970-01-01
    相关资源
    最近更新 更多