在构建失败时运行Maven插件

时间:2017-01-27 12:22:28

标签: maven

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

1 个答案:

答案 0 :(得分: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安装,也可以在项目基目录(.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>

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

唯一要做的事情就是编写间谍应该做的事情。在你的情况下,它应该调用一个Maven插件,所以你看一下Mojo Executor库,这很容易做到。