maven - run - mvn package
Maven: ciclo de vida vs. fase vs. complemento vs. meta (7)
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 objetivos.
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!
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 objetivo), que son las unidades más pequeñas de una construcción Maven.
Por lo tanto, tenemos ciclos de compilación (básicamente, conjunto de acciones para un objetivo general específico), que consisten en fases (granularidad más baja, 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. A continuación, (también) decide qué objetivo 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 objetivo, del mismo complemento o de diferentes objetivos de diferentes complementos)
Una foto que preparé para resumir el conjunto
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 fase de
compile
(no se menciona, lamentablemente)> - Invoco el plugin Maven Compiler (
artifactId
yversion
)> - Invoco su objetivo de
compile
> - como se define por la ejecución de
default-compile
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 compile (una fase diferente) para compilar código de prueba (a través de su objetivo testCompile
) en una ejecución diferente ( default-testCompile
). También podría compilar (utilizando 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 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 objetivos (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 compilació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 compilació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é objetivo (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 (compilar, probar, empaquetar, etc.): ejecutar objetivos 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 compilació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 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 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 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 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 compila primero.
Tenga en cuenta que al especificar varios objetivos para la misma execution
, aún verá claramente en el registro de compilación dos ejecuciones diferentes (con el mismo ID) para los dos objetivos diferentes (por lo tanto, todavía única tupla).
Crédito a Sandeep Jindal y Premraj (de aquí ¿Cuáles son los objetivos 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 objetivo
El objetivo es como una acción en el complemento . Entonces, si el plugin es una clase, el objetivo 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 objetivo limpio. Entonces, cuando llamas este comando:
mvn clean
Llamará a la fase de pre-limpieza y la fase limpia que se vincula con el objetivo limpio: limpio.
Es casi lo mismo que:
mvn pre-clean clean:clean
Entonces, para explicar un poco más, como se describe maven.apache.org/guides/introduction/…
Las compilaciones de Maven están divididas en ciclos de vida, estas son:
- limpiar
- compilación (predeterminado)
- sitio
Cada uno de estos ciclos se divide en fases. Por ejemplo, build se divide en fases como:
- preparar recursos
- compilar
- paquete
- instalar
Las fases tienen objetivos 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 objetivos como fases adicionales "insertadas" si lo desea. Lea here o eche un vistazo a la respuesta de @Gerolds para más detalles.
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, ..., compilar, ..., 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 objetivos de complemento a las fases del ciclo de vida y los objetivos cumplen con la tarea que se les ha confiado.
Cuando ejecutamos el " paquete mvn " en un Proyecto Java, Maven vincula los objetivos del complemento a las fases del ciclo de vida, como se muestra en la figura siguiente.
Y tardíamente otro diagrama
- Lifecycles como rectángulos amarillos
- Fases de ciclos de vida como rectángulos azules con fases "callable" 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 objetivos 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 rectángulos recortados en gris. Los complementos proporcionan los Objetivos que pueden vincularse a las Fases.
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:
- Ciclo de vida limpio: esto implica la limpieza del proyecto (para una compilación e implementación nuevas)
- Ciclo de vida predeterminado / de compilación: maneja la implementación completa del proyecto
- Ciclo de vida del sitio: maneja la generación de la documentación de Java del proyecto.
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.
La respuesta de @Drejc no es correcta en su totalidad.
En particular:
Cada una de estas fases puede tener un objetivo para ejecutarse
antes o después de una fase, por ejemplo:
•preinstalar - ...
•post-paquete - ...
Puede ver los objetivos 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 objetivos. El código implementado en los objetivos es el verdadero caballo de batalla. ( Maven en su núcleo solo está administrando complementos y ejecutando 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 (todas las veces) y ejecuta todos los objetivos (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 objetivo, 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 compilación
Si alguna vez se preguntó cómo sabe Maven qué hacer sin enlazar ningún objetivo en el POM, hay un enlace a
default-bindings.xml
al final que se encuentra en<Your Maven installation>/lib/maven-core-xyzjar/META-INF/plexus/default-bindings.xml
.Las fases de los ciclos de vida incorporados ( limpio , predeterminado , sitio ) se declaran en
<Your Maven installation>/lib/maven-core-xyzjar/META-INF/plexus/components.xml
en.../<component>/<role>org.apache.maven.lifecycle.Lifecycle
.Maven: The Complete Reference, Capítulo 4. El ciclo de vida de compilación