pom plugin compiler java maven-2 maven-plugin mojo

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() { ... }