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
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
compile
fase (no mencionado, lamentablemente)>
- Estoy invocando el complemento del compilador Maven (
artifactId
y version
)>
- Invoco su
compile
objetivo>
- según lo definido por la
default-compile
ejecució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-compile
fase (una fase diferente) para compilar el código de prueba (a través de su testCompile
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 mismo default-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 hay executions
sección, pero configuration
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:
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 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).