2017-01-27 7 views
2

Я использую плагин для отправки сообщения Slack через Maven. Мне интересно, можно ли использовать плагин, когда сборка завершилась неудачей, поэтому я автоматически получаю уведомление о неудавшейся сборке?Запустите плагин Maven при сбое сборки

+0

Разве вам не легче сообщить серверу сборки? –

+0

@JF Meier хорошая точка, мы сделаем это в будущем. Но, тем не менее, это не так, как я спрашиваю? – Jelle

ответ

0

Вы можете сделать это в самом Maven через механизм EventSpy, встроенный в Maven 3.0.2. На каждом этапе сборки несколько событий поднимаются самим Maven или настраиваемым кодом, и можно прослушивать эти события для выполнения некоторых действий. Событие выполнения, поднятое Maven, представлено классом ExecutionEvent. Каждое событие имеет a type, в котором описывается, какое событие он представляет: project failure, Mojo failure, project skipped и т. Д. В этом случае событие сбоя проекта - это то, что вы ищете.

Пользовательский шпион по событиям - это просто класс Java, который реализует интерфейс EventSpy. Предпочтительно, он должен наследовать от вспомогательного класса 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!"); 
      } 
     } 
    } 

} 

Этот код просто регистрирует шпион через сплетение @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, что делает ее очень простой.

Смежные вопросы