Maven: ciclo de vida frente a fase frente a complemento frente a meta

Desarrollador relativamente nuevo aquí, aunque lo he estado usando por un tiempo, espero solidificar mis fundamentos de Maven. Parte de mi problema es que no tengo experiencia con Ant, que parece ser el origen de muchas explicaciones. He estado leyendo y viendo tutoriales, y sigo escuchando los mismos términos:

  • Ciclo vital
  • Fase
  • Enchufar
  • Gol

Según lo que he aprendido, parece que el ciclo de vida es el más amplio del grupo y está compuesto (o completado por) fases, complementos y / o objectives.

Pregunta : ¿Podría proporcionarnos información sobre cómo se relacionan estos términos y los ejemplos más comunes?

¡Cuanto más explícito y básico, mejor!

La respuesta de @Drejc no es correcta en su totalidad.

En particular:

Cada una de estas fases puede tener un objective para ejecutarse antes o después de una fase, por ejemplo:

preinstalar – …
post-paquete – …

Puede ver los objectives como fases adicionales “insertadas” si lo desea.

[Tramos de declaraciones incorrectas por mí.]

Un ciclo de vida Maven es un concepto (abstracto) que cubre todos los pasos (o mejor: todos los pasos que los diseñadores de Maven decidieron apoyar) que se espera que ocurran en la vida de desarrollo de un proyecto. Estos pasos (o etapas) se denominan fases en la terminología de Maven.

Un plugin Maven es un contenedor para / proveedor de objectives. El código implementado en los objectives es el verdadero caballo de batalla. ( Maven en su núcleo solo está administrando complementos y ejecutando objectives ). Cada uno de los objectives de un complemento se puede asignar / vincular a cualquiera de las fases del ciclo de vida.

Al invocar mvn Maven pasa todas las fases (todas las veces) y ejecuta todos los objectives (proporcionados por los complementos) que se han vinculado a cualquiera de las fases anteriores y hasta (e incluyendo) la fase dada. Si hay una fase sin objective, no se hace nada. Pero la fase se pasa sin embargo.

Es decir, no puede “insertar” fases adicionales en uno de los ciclos de vida incorporados de Maven. Ellos ya están allí, ¡siempre! Podría desarrollar su propio ciclo de vida con sus propias fases, pero eso es mucho más que simplemente usar Maven tal como es.

Las fases llamadas “preinstalación” o “post-paquete” no existen.

Referencias

  • Maven, Introducción al ciclo de vida de comstackción

    Si alguna vez se preguntó cómo sabe Maven qué hacer sin enlazar ningún objective en el POM, hay un enlace a default-bindings.xml al final que se encuentra en /lib/maven-core-xyzjar/META-INF/plexus/default-bindings.xml .

    Las fases de los ciclos de vida incorporados ( limpio , predeterminado , sitio ) se declaran en /lib/maven-core-xyzjar/META-INF/plexus/components.xml en ...//org.apache.maven.lifecycle.Lifecycle .

  • Maven: The Complete Reference, Capítulo 4. El ciclo de vida de comstackción

  • Maven por ejemplo, 3.5. Conceptos básicos

Maven: ciclo de vida vs. fase vs. complemento vs. meta

Respuesta tardía solo para aclarar otro nivel de granularidad que falta en este hilo: ejecuciones (de un objective), que son las unidades más pequeñas de una construcción Maven.

Por lo tanto, tenemos ciclos de comstackción (básicamente, conjunto de acciones para un objective general específico), que consisten en fases (granularidad más baja, un paso de ciclo), que pueden invocar un conjunto de objectives configurados proporcionados por ciertos complementos . Es decir, Maven es (también) un ejecutor de complementos, cada complemento puede ofrecer uno o más objectives. A continuación, (también) decide qué objective se adjunta a qué fase, la mayoría de las veces en el ciclo de vida predeterminado (sin ninguna, es decir, el valor predeterminado). Pero en realidad puede tener otro nivel: ejecuciones (del mismo objective, del mismo complemento o de diferentes objectives de diferentes complementos)

Una foto que preparé para resumir el conjunto enter image description here

Y de hecho así es como Maven lo muestra (su unidad de trabajo más pequeña) a través de la cadena única en su registro de comstackción:

 plugin-artifactId:plugin-version:plugin-goal (goal-execution-id) @ project-name 

Por ejemplo, tendríamos:

 [INFO] --- maven-compiler-plugin:2.5.1:compile (default-compile) @ sample-project --- 

Lo que de hecho significa (a través de diferentes niveles de granularidad):

  • durante la fase de compile (no se menciona, lamentablemente)>
  • Invoco el plugin Maven Compiler ( artifactId y version )>
  • Invoco su objective de compile >
  • como se define por la ejecución de default-compile

Es único porque de hecho podría tener el mismo objective (del mismo complemento) vinculado a diferentes fases o a la misma fase pero en diferentes ejecuciones (es decir, con diferentes configuraciones). El maven-compiler-plugin , por ejemplo, también se usa durante la fase de test-compile (una fase diferente) para comstackr código de prueba (a través de su objective testCompile ) en una ejecución diferente ( default-testCompile ). También podría comstackr (utilizando el mismo complemento y objective) algún código generado automáticamente durante una fase diferente según lo definido por una ejecución que haya especificado en el POM (y potencialmente una configuración diferente).

Las ejecuciones predeterminadas se proporcionan de fábrica con los enlaces de empaquetado de Maven , es decir, de forma predeterminada (y aplicando la convención sobre la configuración) Maven ya invoca ciertos objectives (de los complementos estándar) durante ciertas fases. Los ID de ejecución de estas invocaciones predeterminadas se definen según ciertas convenciones .

Esto también explica por qué si realmente desea anular un comportamiento predeterminado (enlace) de una comstackción Maven, debe especificar (anular) exactamente la misma identificación de ejecución en su POM para el mismo complemento. Podría, por ejemplo, omitir la comstackción simplemente definiendo una ejecución del maven-compiler-plugin con el mismo ID de default-compile pero ligado a una fase no existente (o una vacía).

Para abreviar : una ejecución le dice a Maven qué objective (s) ejecutar con qué configuración dentro de qué fase.

Algunas ejecuciones se proporcionan por defecto (enlaces defaul), lo que explica por qué el maven minimal pom de solo 6 líneas ya puede hacer mucho (comstackr, probar, empaquetar, etc.): ejecutar objectives de plugins estándar en ciertas fases: es una convención sobre configuración. Luego, a través de la configuración pom.xml , puede agregar cosas (ejecuciones) a la comstackción o influir en el comportamiento de los complementos ya configurados (en este caso, no es suficiente la sección de executions , pero solo la configuration ).

Sí, podría omitir los ciclos de creación (y sus fases) e invocar directamente los objectives (de los complementos). Imagina lo siguiente:

 mvn compiler:compile mvn compiler:testCompile mvn surefire:test mvn jar:jar 

(NOTA: también puede invocar en línea en una sola llamada)

Aquí estamos comstackndo el código de la aplicación, el código de prueba, las pruebas de ejecución y el paquete: imagínese lo manual, propenso a errores, repetitivo y lento que sería. La convención sobre configuración nos ayuda: Maven presenta ciclos y fases de vida de construcción. El ciclo de vida predeterminado (sin nombre, es decir, el valor predeterminado), proporciona un rango de fases basado en las mejores prácticas y convenciones (el mantra de Maven).
Si desea lograr lo mismo que arriba, simplemente ejecute: mvn package y automáticamente comstackrá, probará y empaquetará su proyecto. ¿Cómo? invocando complementos. Es decir, las fases son un conjunto significativo y configurable de ejecuciones de complementos (objectives). Para que sea aún más estándar, para cada fase Maven invocará primero cualquier fase anterior, de modo que, por ejemplo, si desea probar, estará seguro de que comstack primero.

Tenga en cuenta que al especificar varios objectives para la misma execution , aún verá claramente en el registro de comstackción dos ejecuciones diferentes (con el mismo ID) para los dos objectives diferentes (por lo tanto, todavía única tupla).

Crédito a Sandeep Jindal y Premraj (de aquí ¿Cuáles son los objectives y fases de Maven y cuál es su diferencia? ). Su explicación me ayudó a entender.

Creé algunos ejemplos de código completo y algunas explicaciones simples aquí https://www.surasint.com/maven-life-cycle-phase-and-goal-easy-explained/ . Creo que puede ayudar a otros a entender y puede intentar algo directamente.

En resumen, desde el enlace, no debe tratar de entender los tres a la vez, primero debe comprender la relación en estos grupos:

  • Ciclo de vida vs fase
  • Plugin vs Goal

1. Ciclo de vida vs Fase

El Ciclo de Vida es una colección de fases en secuencia, mira aquí Referencias de Ciclo de Vida . Cuando llamas a una fase , también llamará a todas las fases anteriores.

Por ejemplo, el ciclo de vida de limpieza tiene 3 fases ( pre-clean, clean, post-clean ).

 mvn clean 

Llamará a limpieza previa y limpieza .

2. Complemento contra objective

El objective es como una acción en el complemento . Entonces, si el plugin es una clase, el objective es un método.

puedes llamar a un gol como este:

 mvn clean:clean 

Esto significa “llamar a la meta limpia, en el plugin limpio” (Nada se relaciona con la fase de limpieza aquí. No dejes que la palabra “limpiar” te confunda, ¡no son lo mismo! Mira la explicación completa en mi enlace de arriba)

3. Ahora la relación entre Fase y Meta:

La fase puede (pre) vincularse a Objetivo (s). Por ejemplo, normalmente, la fase limpia se vincula al objective limpio. Entonces, cuando llamas este comando:

 mvn clean 

Llamará a la fase de pre-limpieza y la fase limpia que se vincula con el objective limpio: limpio.

Es casi lo mismo que:

 mvn pre-clean clean:clean 

Fuente: http://www.codetab.org/apache-maven-tutorial/ , este es un buen tutorial

Lifecycles, Lifecycle Phases, Plugins y Plugin Goals son el núcleo de Maven.

  • El comando mvn de Maven solo puede aceptar la fase de ciclo de vida o la meta de complemento como argumento.
  • Maven viene con tres ciclos de vida: predeterminado, limpio y de sitio.
  • Cada ciclo de vida se compone de fases del ciclo de vida y, en total, hay 28 fases: valor predeterminado 21 ( validar, …, comstackr, …, paquete, …, instalar, implementar ), limpiar 3 ( pre-limpiar, clean, post-clean ) y el sitio 4 ( pre-site, site, post-site, site-deploy ).
  • cuando se invoca una fase de ciclo de vida utilizando el comando mvn, todas las fases anteriores se ejecutan secuencialmente una tras otra.
  • las fases del ciclo de vida por sí mismas no tienen ninguna capacidad para realizar alguna tarea y dependen de complementos para llevar a cabo la tarea.
  • según el tipo de proyecto y tipo de paquete, Maven vincula varios objectives de complemento a las fases del ciclo de vida y los objectives cumplen con la tarea que se les ha confiado.

Cuando ejecutamos el ” paquete mvn ” en un Proyecto Java, Maven vincula los objectives del complemento a las fases del ciclo de vida, como se muestra en la figura siguiente.

mvn-plugins-package-goal

Entonces, para explicar un poco más, como se describe aquí

Las comstackciones de Maven están divididas en ciclos de vida, estas son:

  • limpiar
  • comstackción (predeterminado)
  • sitio

Cada uno de estos ciclos se divide en fases. Por ejemplo, build se divide en fases como:

  • preparar recursos
  • comstackr
  • paquete
  • instalar

Las fases tienen objectives para ejecutarse antes o después de una fase, por ejemplo:

  • pre-clean – se ejecutará antes de la fase limpia
  • post-clean – se ejecutará después de la fase limpia

Puede ver los objectives como fases adicionales “insertadas” si lo desea. Lea aquí o eche un vistazo a la respuesta de @Gerolds para más detalles.

Y tardíamente otro diagtwig

  • Lifecycles como rectangularjs amarillos
  • Fases de ciclos de vida como rectangularjs azules con fases “invocables” en azul oscuro (es decir, las fases con hiperación generalmente no se llaman desde la línea de comandos, ya que pueden no estar diseñadas para dejar el proyecto en un estado bien definido).
  • Metas como pastillas azules. La asociación / vinculación “phase -> goal” que se muestra es la del modo de empaquetado “jar”. Cada fase puede tener objectives ligados a ella. Esto se aplica, por supuesto, a cada uno de los ciclos de vida, aunque los enlaces solo se muestran para el ciclo de vida “predeterminado”.
  • Complementos como rectangularjs recortados en gris. Los complementos proporcionan los Objetivos que pueden vincularse a las Fases.

Maven Lifecycles, fases, objetivos, complementos

LifeCycle vs Phases: Life Cycle es una colección de phases . Cuando llamas a una fase, también llama a todas las fases que se le presentan. Maven viene con 3 ciclos de vida de construcción integrados como:

  1. Ciclo de vida limpio: esto implica la limpieza del proyecto (para una comstackción e implementación nuevas)
  2. Ciclo de vida predeterminado / de comstackción: maneja la implementación completa del proyecto
  3. Ciclo de vida del sitio: maneja la generación de la documentación de Java del proyecto. enter image description here

El ciclo de vida limpio tiene 3 fases: limpieza previa, limpieza y limpieza posterior. Las fases predeterminadas y de los ciclos de vida del sitio son las mismas que se muestran en la imagen.