构建失败时运行 Maven 插件

Jel*_*lle 5 maven

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

Tun*_*aki 5

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

事件的自定义间谍只是一个实现该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!");
            }
        }
    }

}
Run Code Online (Sandbox Code Playgroud)

此代码只是通过 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>
Run Code Online (Sandbox Code Playgroud)

一旦该项目被编译并安装到本地存储库(通过),您就可以通过核心扩展机制mvn clean install将其添加到另一个项目的构建中。

在 Maven 3.3.1 之前,您必须将my-spyJAR 放入文件夹中${MAVEN_HOME}/lib/ext,以便 Maven 可以找到它。从 3.3.1 开始,您不需要摆弄 Maven 安装,并且可以.mvn/extensions.xml在项目基目录 ( ${maven.multiModuleProjectDirectory}/.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>
Run Code Online (Sandbox Code Playgroud)

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


唯一剩下要做的事情是编写间谍应该做什么的代码。就您而言,它应该调用 Maven 插件,因此您可以查看Mojo Executor库,这使得这一切变得非常容易。