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!
maven
maven-3
pom.xml
maven-lifecycle
Jeff Levine
fuente
fuente
Respuestas:
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
mvn
sin ninguna fase u objetivo [con saltos de línea y abreviado para facilitar la lectura aquí]: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.xml
bajo.../<component>/<role>org.apache.maven.lifecycle.Lifecycle
.fuente
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
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:
Por ejemplo, tendríamos:
Lo que de hecho significa (a través de diferentes niveles de granularidad):
compile
fase (no mencionado, lamentablemente)>artifactId
yversion
)>compile
objetivo>default-compile
ejecuciónEs ú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 latest-compile
fase (una fase diferente) para compilar el código de prueba (a través de sutestCompile
objetivo) 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-plugin
con el mismodefault-compile
ID 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.xml
configuración, puede agregar cosas (ejecuciones) a la compilación o influir en el comportamiento de los complementos ya configurados (en este caso, no hayexecutions
sección, peroconfiguration
sería suficiente).Sí, puede omitir los ciclos de compilación (y sus fases) e invocar directamente los objetivos (de los complementos). Imagina lo siguiente:
(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 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 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).fuente
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:
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 ).
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:
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:
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:
fuente
clean:clean
no es la mejor opción como ejemplo. Hay 4 elementos nombradosclean
(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 ".Y tardíamente otro diagrama
fuente
validate
,initialize
yverify
.resources:[testR|r]esources
objetivo NO está vinculado a las fasesprocess-sources
oprocess-test-sources
deljar
ciclo de vida .modello:java
del 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.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.
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.
fuente
mvn ...
: en default-bindings.xml o en un POM y no lo hace Maven sino un humano.Entonces, para explicar un poco más como se describe aquí
Las compilaciones de Maven se dividen en ciclos de vida, estos son:
Cada uno de estos ciclos se divide en fases. Por ejemplo, la construcción se divide en fases como:
Fases tienen objetivos para ejecutar antes de pre- o después de post- fase a, por ejemplo:
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.
fuente
LifeCycle vs Phases:
Life Cycle
es una colección dephases
. 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: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.
fuente
mvn <phase>
. Vea mi respuesta aquí.