java - pom - maven-compiler-plugin version
¿Cómo se fuerza a un maven MOJO a ejecutarse solo una vez al final de una compilación? (7)
Creo que puede obtener lo que necesita si usa la etiqueta @aggregator y vincula su mojo a una de las siguientes fases del ciclo de vida:
- preparar-paquete
- paquete
- prueba previa a la integración
- examen de integración
- prueba post-integración
- verificar
- instalar
- desplegar
Tengo un MOJO que me gustaría ejecutar una vez, y una vez después de la fase de prueba del último proyecto en el reactor para ejecutar.
Utilizando:
if (!getProject().isExecutionRoot()) {
return ;
}
al comienzo del método execute () significa que mi mojo se ejecuta una vez, sin embargo, al comienzo de la creación, antes de todos los demás módulos secundarios.
Normalmente, esto es una cuestión de configuración. Es posible que deba configurar un proyecto solo para el mojo y hacerlo dependiente de todos los otros proyectos. O bien, podría forzar que uno de los proyectos secundarios sea el último al hacerlo dependiente de todos los otros niños.
La mejor solución que he encontrado para esto es:
/**
* The projects in the reactor.
*
* @parameter expression="${reactorProjects}"
* @readonly
*/
private List reactorProjects;
public void execute() throws MojoExecutionException {
// only execute this mojo once, on the very last project in the reactor
final int size = reactorProjects.size();
MavenProject lastProject = (MavenProject) reactorProjects.get(size - 1);
if (lastProject != getProject()) {
return;
}
// do work
...
}
Esto parece funcionar en las pequeñas jerarquías de compilación con las que he probado.
Hay una entrada de blog Sonatype que describe cómo hacer esto. El último proyecto que se ejecutará será el proyecto raíz, ya que contendrá referencias de módulos al resto. Por lo tanto, necesita una prueba en su mojo para verificar si el directorio del proyecto actual es el mismo que el directorio desde el que se lanzó Maven:
boolean result = mavenSession.getExecutionRootDirectory().equalsIgnoreCase(basedir.toString());
En la entrada referenciada hay un ejemplo bastante completo de cómo usar esto en tu mojo.
Echa un vistazo a maven-monitor API
Puede agregar un EventMonitor al despachador y luego atrapar el END del evento ''reactor-execute'': este se envía después de que todo se haya completado, es decir, incluso después de que vea la salida BUILD SUCCESSFUL / FAILED.
Así es como lo usé recientemente para imprimir un resumen al final:
/**
* The Maven Project Object
*
* @parameter expression="${project}"
* @required
* @readonly
*/
protected MavenProject project;
/**
* The Maven Session.
*
* @parameter expression="${session}"
* @required
* @readonly
*/
protected MavenSession session;
...
@Override
public void execute() throws MojoExecutionException, MojoFailureException
{
//Register the event handler right at the start only
if (project.isExecutionRoot())
registerEventMonitor();
...
}
/**
* Register an {@link EventMonitor} with Maven so that we can respond to certain lifecycle events
*/
protected void registerEventMonitor()
{
session.getEventDispatcher().addEventMonitor(
new EventMonitor() {
@Override
public void endEvent(String eventName, String target, long arg2) {
if (eventName.equals("reactor-execute"))
printSummary();
}
@Override
public void startEvent(String eventName, String target, long arg2) {}
@Override
public void errorEvent(String eventName, String target, long arg2, Throwable arg3) {}
}
);
}
/**
* Print summary at end
*/
protected void printSummary()
{
...
}
La solución con el uso de session.getEventDispatcher () ya no funciona desde Maven 3.x. Todo el evento se ha eliminado en este compromiso: https://github.com/apache/maven/commit/505423e666b9a8814e1c1aa5d50f4e73b8d710f4
La mejor solución es confiar en una extensión de ciclo de vida al extender su clase desde org.apache.maven.AbstractMavenLifecycleParticipant
(consulte también https://maven.apache.org/examples/maven-3-lifecycle-extensions.html ) que obtuvo un método afterSessionEnd
agregado con https://issues.apache.org/jira/browse/MNG-5640 (reparado en Maven 3.2.2).