Maven: ciclo de vida frente a fase frente a complemento frente a objetivo [cerrado]

106

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 ninguna experiencia con Ant, que parece ser de donde provienen muchas explicaciones. He estado leyendo y viendo tutoriales, y sigo escuchando los mismos términos:

  • Ciclo vital
  • Fase
  • Enchufar
  • Objetivo

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

Pregunta : ¿Podría proporcionar 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!

Jeff Levine
fuente
Gracias @Drejc, no puedo creer que no encontré esto en mi búsqueda. Lo leeré ahora.
Jeff Levine
2
Entonces, para aclarar, construya ciclo de vida = ciclo de vida , de los cuales hay tres tipos: ¿predeterminado, limpio y sitio? Otras explicaciones me hicieron pensar que había un cuarto ciclo de vida llamado compilación .
Jeff Levine
3
¿Demasiado amplia? Esto se refiere a los conceptos básicos básicos de Maven y tiene algunas respuestas buenas y detalladas. Los moderadores sin una sola etiqueta de maven no deberían poder decidir esto.
Gerold Broser

Respuestas:

73

UNA ciclo de vida de Maven es un concepto (abstracto) que cubre todos los pasos (o mejor: todos los pasos que los diseñadores de Maven decidieron respaldar) 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.

UNA complemento de Maven es un contenedor para / proveedor de objetivos. El código implementado en los objetivos es el verdadero caballo de batalla. ( Maven en sí mismo es solo administrar complementos y ejecutar objetivos ). Cada uno de los objetivos de un complemento se puede asignar / vincular a cualquiera de las fases del ciclo de vida.

Al invocar, mvn <phase> Maven pasa todas las fases (cada vez) y ejecuta todos los objetivos (proporcionados por complementos) que se han vinculado a cualquiera de las fases anteriores y hasta (e incluida) la fase dada. Si hay una fase sin ningún objetivo, no se hace nada. Pero la fase ha pasado de todos modos.

Es decir, no puede "'insertar' fases adicionales" en uno de los ciclos de vida integrados de Maven. ¡Ya están ahí, 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 está.

Los objetivos también se pueden ejecutar directamente, lo que se le dice cuando se ejecuta mvnsin ninguna fase u objetivo [con saltos de línea y abreviado para facilitar la lectura aquí]:

You must specify a valid lifecycle phase or a goal in the format

<plugin-prefix>:<goal> or

<plugin-group-id>:<plugin-artifact-id>[:<plugin-version>]:<goal>.

Available lifecycle phases are:

... see actual output or 'Maven, Introduction to the Build Lifecycle' at 'References' below ...

Referencias:

Si alguna vez se preguntó cómo sabe Maven qué hacer sin ningún objetivo vinculante en el POM, hay un enlace a default-bindings.xml final que se encuentra en <Your Maven installation>/lib/maven-core-x.y.z.jar/META-INF/plexus/default-bindings.xml.

Las fases de los ciclos de vida incorporados ( limpia , por defecto , sitio ) se declaran en <Your Maven installation>/lib/maven-core-x.y.z.jar/META-INF/plexus/components.xmlbajo .../<component>/<role>org.apache.maven.lifecycle.Lifecycle.

Gerold Broser
fuente
41

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

Respondiendo tarde solo para aclarar otro nivel de granularidad que falta en este hilo: ejecuciones (de un objetivo), que son las unidades más pequeñas de una compilación de Maven.

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

Una imagen que preparé para resumir todo ingrese la descripción de la imagen aquí

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 compilació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 compilefase (no mencionado, lamentablemente)>
  • Estoy invocando el complemento del compilador Maven ( artifactIdy version)>
  • Invoco su compileobjetivo>
  • según lo definido por la default-compileejecución

Es único porque, de hecho, podría tener el mismo objetivo (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 test-compilefase (una fase diferente) para compilar el código de prueba (a través de su testCompileobjetivo) en una ejecución diferente ( default-testCompile). También puede compilar (usando el mismo complemento y objetivo) algún código generado automáticamente durante una fase diferente según lo definido por una ejecución que especificó en el POM (y potencialmente una configuración diferente).

Las ejecuciones predeterminadas se proporcionan listas para usar a través de los enlaces de empaque de Maven , es decir, de manera predeterminada (y aplicando la convención sobre la configuración), Maven ya invoca ciertos objetivos (de complementos estándar) durante ciertas fases. Los identificadores de ejecución de estas invocaciones predeterminadas se definen de acuerdo con ciertas convenciones .

Esto también explica por qué si realmente desea anular un comportamiento predeterminado (enlace) de una compilación de Maven, debe especificar (anular) exactamente la misma identificación de ejecución en su POM para el mismo complemento. Por ejemplo, podría omitir la compilación simplemente definiendo una ejecución de la maven-compiler-plugincon el mismo default-compileID pero vinculada a una fase no existente (o una vacía).

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

Algunas ejecuciones se proporcionan de forma predeterminada (enlaces predeterminados), lo que explica por qué el pom mínimo de maven de solo 6 líneas ya puede hacer mucho (compilar, probar, empaquetar, etc.): ejecutar objetivos de complementos estándar en ciertas fases: se acabó la convención configuración. Luego, a través de la pom.xmlconfiguración, puede agregar cosas (ejecuciones) a la compilación o influir en el comportamiento de los complementos ya configurados (en este caso, no hay executionssección, pero configurationsería suficiente).

Sí, puede omitir los ciclos de compilación (y sus fases) e invocar directamente los objetivos (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 compilando código de aplicación, código de prueba, ejecución de pruebas y paquete: imagina lo manual, propenso a errores, repetitivo y lento que sería esto. La convención sobre la configuración nos ayuda: Maven presenta ciclos de vida y fases de construcción . El ciclo de vida predeterminado (sin nombre, es decir, el predeterminado), proporciona un rango de fases basadas en las mejores prácticas y convenciones (el mantra de Maven).
Si desea lograr lo mismo que el anterior, simplemente ejecute: mvn packagey automáticamente compilará, probará y empaquetará su proyecto. ¿Cómo? invocando complementos. Es decir, las fases son un conjunto significativo y configurable de ejecuciones de complementos (objetivos). Para hacerlo aún más estándar, para cada fase, Maven invocará en primer lugar cualquier fase anterior, de modo que, por ejemplo, si desea probar, se asegurará de compilar primero.

ps tenga en cuenta que al especificar varios objetivos para el mismo execution, todavía verá claramente en el registro de compilación dos ejecuciones diferentes (con la misma identificación) para los dos objetivos diferentes (por lo tanto, todavía una tupla única).

A_Di-Matteo
fuente
18

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

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

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

  • Ciclo de vida vs fase
  • Complemento vs objetivo

1. Ciclo de vida frente a fase

Life Cycle es una colección de fases en secuencia, consulte aquí Life Cycle References . Cuando llame a una fase , también llamará a todas las fases anteriores.

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

mvn clean

Se llamará limpieza previa y limpieza .

2. Complemento frente a objetivo

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

puedes llamar a un objetivo como este:

mvn clean:clean

Esto significa "llamar al objetivo limpio, en el complemento limpio" (Nada se relaciona con la fase limpia aquí. No dejes que la palabra "limpio" te confunda, ¡no son lo mismo! Mira la explicación completa en mi enlace arriba)

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

La fase puede (pre) vincularse a las metas . Por ejemplo, normalmente, la fase limpia se vincula con la meta limpia. Entonces, cuando llamas a este comando:

mvn clean

Llamará a la fase de limpieza previa y a la fase de limpieza que se vincula con la meta de limpieza: limpieza.

Es casi lo mismo que:

mvn pre-clean clean:clean
Surasin Tancharoen
fuente
1
@ 2. & 3. En mi humilde opinión, clean:cleanno es la mejor opción como ejemplo. Hay 4 elementos nombrados clean(ciclo de vida, fase, complemento, objetivo) que pueden resultar confusos, especialmente para los principiantes (recuerdo que era para mí al principio). @ 3. El verbo "enlazar" tampoco es una buena elección, en mi humilde opinión. El término oficial de Maven es " vincular ".
Gerold Broser
@GeroldBroser. Totalmente de acuerdo con limpio: limpio. Ya lo había explicado y advertido en mi explicación completa en el enlace. Copiaré esas advertencias aquí también. La razón por la que lo usé es porque es bueno que la gente sepa sobre esta palabra confusa y, especialmente, el documento oficial de Maven la está usando y eso lo explica claramente. Y sí, también me estaba confundiendo. De todos modos, muchas gracias por los comentarios
Surasin Tancharoen
error tipográfico: el documento oficial de Maven lo está usando y no lo explica claramente
Surasin Tancharoen
17

Y tardíamente otro diagrama

  • Ciclos de vida como rectángulos amarillos
  • Fases de los ciclos de vida como rectángulos azules con fases "invocables" en azul más oscuro (es decir, las fases con hipenación no suelen llamarse desde la línea de comandos, ya que pueden no estar diseñadas para dejar el proyecto en un estado bien definido).
  • Goles como pastillas azules. La "fase -> objetivo" de asociación / enlace que se muestra es la del modo de empaquetado "jar" . Cada fase puede tener objetivos vinculados a ella. Por supuesto, esto es válido para cada uno de los ciclos de vida, aunque los enlaces solo se muestran para el ciclo de vida "predeterminado".
  • Complementos como rectángulos grises recortados. Los complementos proporcionan los Objetivos que pueden vincularse a las Fases.

Ciclos de vida de Maven, fases, objetivos, complementos

David Tonhofer
fuente
El archivo graphml (editado con el editor yEd gratuito) está disponible en github.com/dtonhofer/diagrams
David Tonhofer
1) ¿Qué quiere decir exactamente con "fases " invocables "que están" en azul más oscuro? "? Cada fase de Maven es "invocable" (aunque prefiero llamarla invocable , ya que no hay código llamado directamente invocando una fase). ¿O llama a las fases " invocables " que tienen un objetivo vinculado (por defecto)? Ni siquiera eso es cierto, si miras validate, initializey verify.
Gerold Broser
2) El resources:[testR|r]esourcesobjetivo NO está vinculado a las fases process-sourceso process-test-sourcesdel jarciclo de vida .
Gerold Broser
3) modello:javadel complemento Modello aparentemente es específico del dominio. Vincular el objetivo de un complemento a una fase es válido para cualquiera de las fases.
Gerold Broser
@GeroldBroser Corregido según comentarios. "Invocable" significa que uno puede llamarlo desde la línea de comando y esperar que el proyecto permanezca en un estado válido. No hay una distinción significativa entre llamar e invocar y llamar es lo que utiliza la Introducción de Maven .
David Tonhofer
12

Fuente este es un tutorial realmente bueno

Los ciclos de vida, las fases del ciclo de vida, los complementos y los objetivos de los complementos son el núcleo de Maven.

  • El comando de Maven mvn solo puede aceptar la fase del ciclo de vida o el objetivo del complemento como argumento.
  • Maven viene con tres ciclos de vida: predeterminado, limpio y sitio.
  • Cada ciclo de vida se compone de fases del ciclo de vida y, en total, hay 28 fases: 21 por defecto ( validar, ..., compilar, ..., empaquetar, ..., instalar, implementar ), limpiar 3 ( limpiar previamente, clean, post-clean ) y el sitio 4 ( pre-sitio, sitio, post-sitio, implementación del sitio ).
  • cuando se invoca una fase del ciclo de vida mediante 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 realizar la tarea.
  • Según el proyecto y el tipo de paquete, Maven vincula varios objetivos de complementos a las fases del ciclo de vida y los objetivos para llevar a cabo la tarea que se les ha confiado.

Cuando corremos " paquete mvn " en un proyecto Java, Maven vincula los objetivos del complemento a las fases del ciclo de vida, como se muestra en la siguiente figura.

mvn-plugins-package-goal

Erlan
fuente
1
El material que ha mencionado es bastante bueno. ¡Gracias!
William Kinaan
@ " El comando de Maven mvn solo puede aceptar como argumento la fase del ciclo de vida o el objetivo del complemento " no es correcto. También acepta opciones .
Gerold Broser
" Cuando ejecutamos" paquete mvn "en un proyecto de Java, Maven vincula los objetivos del complemento a las fases del ciclo de vida " no es cierto. El enlace de objetivos ocurre mucho antes de ejecutarse mvn ...: en default-bindings.xml o en un POM y no lo hace Maven sino un humano.
Gerold Broser
7

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

Las compilaciones de Maven se dividen en ciclos de vida, estos son:

  • limpiar
  • construir (predeterminado)
  • sitio

Cada uno de estos ciclos se divide en fases. Por ejemplo, la construcción se divide en fases como:

  • preparar recursos
  • compilar
  • paquete
  • Instalar en pc

Fases tienen objetivos para ejecutar antes de pre- o después de post- fase a, por ejemplo:

  • pre-clean - se ejecutará antes de la fase de limpieza
  • post-clean: se ejecutará después de la fase de limpieza

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

Drejc
fuente
1
Esta respuesta no es correcta en su totalidad. Mira mi respuesta .
Gerold Broser
O chico 3 años desde que respondiste esta pregunta ... y aún no la dejas ir ... ganaste ... ahora sigue adelante.
Drejc
No se trata de ganar. ¿No revisa las preguntas, respuestas y comentarios anteriores si se encuentra con ellos más adelante?
Gerold Broser
3

LifeCycle vs Phases: Life Cycle es una colección de phases. Cuando llame a una fase, también llamará a todas las fases anteriores. Maven viene con 3 ciclos de vida de compilación integrados como:

  1. Ciclo de vida limpio: esto implica la limpieza del proyecto (para una nueva construcción e implementación)
  2. Ciclo de vida predeterminado / de compilación: esto maneja la implementación completa del proyecto
  3. Ciclo de vida del sitio: se encarga de generar la documentación Java del proyecto. ingrese la descripción de la imagen aquí

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

Arun Raaj
fuente
Tu último párrafo es engañoso. Especialmente la primera y la última oración. Las metas y las fases son cosas totalmente diferentes. No debe confundirlos porque algunos de ellos tienen nombres idénticos. Re "Los objetivos son las fases que ves en la imagen de arriba ": No hay un solo objetivo mencionado en la imagen. Todas estas son fases . Re " Escribe el nombre de la fase como 'objetivo' cuando tiene que realizar un objetivo determinado ": Si bien es posible ejecutar el objetivo de un complemento explícitamente, la forma habitual es realizar una acumulación hasta una determinada fase con mvn <phase>. Vea mi respuesta aquí.
Gerold Broser
Gracias, he eliminado la parte "Plugin vs Goal". Lo actualizaré pronto.
Arun Raaj