【发布时间】:2017-06-13 03:09:55
【问题描述】:
我正在使用插件通过 Maven 发送 Slack 消息。我想知道是否可以在构建失败时使用插件,以便自动收到有关构建失败的通知?
【问题讨论】:
-
让你的构建服务器通知你不是更容易吗?
-
@JF Meier 好点,我们将来会这样做。但是,我问的事情不是可能的吗?
标签: maven
我正在使用插件通过 Maven 发送 Slack 消息。我想知道是否可以在构建失败时使用插件,以便自动收到有关构建失败的通知?
【问题讨论】:
标签: maven
您可以通过 Maven 3.0.2 中内置的 EventSpy 机制在 Maven 内部执行此操作。在构建的每个步骤中,Maven 本身或自定义代码都会引发几个事件,并且可以侦听这些事件以执行某些操作。 Maven 引发的执行事件由类ExecutionEvent 表示。每个事件都有a type,它描述了它所代表的事件类型:project failure、Mojo failure、project 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 库,这很容易做到。
【讨论】: