我正在使用插件通过Maven发送Slack消息。我想知道在构建失败时是否可以使用插件,因此我会自动收到有关构建失败的通知?
答案 0 :(得分:1)
你可以通过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安装,也可以在项目基目录(.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库,这很容易做到。