¿Cuál es la diferencia / relación entre los objetivos y las fases de Maven? ¿Cómo se relacionan entre sí?
¿Cuál es la diferencia / relación entre los objetivos y las fases de Maven? ¿Cómo se relacionan entre sí?
Respuestas:
Los objetivos se ejecutan en fases que ayudan a determinar el orden en que se ejecutan los objetivos. La mejor comprensión de esto es observar los enlaces de ciclo de vida de Maven predeterminados que muestran qué objetivos se ejecutan en qué fases de forma predeterminada. Los objetivos de la fase de compilación siempre se ejecutarán antes que los objetivos de la fase de prueba, que siempre se ejecutarán antes de los objetivos de la fase del paquete, etc.
Parte de la confusión se ve exacerbada por el hecho de que cuando ejecutas maven puedes especificar un objetivo o una fase. Si especifica una fase, entonces Maven ejecutará todas las fases hasta la fase que especificó en orden (por ejemplo, si especifica el paquete, primero se ejecutará a través de la fase de compilación y luego la fase de prueba y finalmente la fase del paquete) y para cada fase se ejecutará. ejecutar todos los objetivos vinculados a esa fase.
Cuando crea una ejecución de complemento en su archivo de compilación Maven y solo especifica el objetivo, entonces lo vinculará a una fase predeterminada determinada. Por ejemplo, el objetivo jaxb: xjc se vincula de forma predeterminada a la fase de generación de recursos. Sin embargo, cuando especifica la ejecución, también puede especificar explícitamente la fase para ese objetivo.
Si especifica un objetivo cuando ejecuta Maven, se ejecutará ese objetivo y solo ese objetivo. En otras palabras, si especifica el objetivo jar: jar, solo ejecutará el objetivo jar: jar para empaquetar su código en un jar. Si no ha ejecutado previamente el objetivo de compilación o ha preparado su código compilado de alguna otra manera, es muy probable que esto falle.
mvn archetype:generate
, y en ese caso, Maven solo ejecuta el objetivo.
mvn test
ejecuta:, --- maven-resources-plugin:2.6:resources ... --- maven-compiler-plugin:3.1:compile ... --- maven-resources-plugin:2.6:testResources ... --- maven-compiler-plugin:3.1:testCompile ... --- maven-surefire-plugin:2.12.4:test
mientras que mvn compiler:testCompile
solo se ejecuta --- maven-compiler-plugin:3.1:testCompile ...
.
mvn clean compiler:testCompile
ejecuta --- maven-clean-plugin:2.5:clean ... --- maven-compiler-plugin:3.1:testCompile
y falla Failed to execute goal org.apache.maven.plugins:maven-compiler-plugin:3.1:testCompile (default-cli) on project mvnphase: Compilation failure ... cannot find symbol ... symbol: variable MvnPhase
(donde MvnPhase
es la clase bajo prueba referenciada en la clase de prueba). Aparentemente, las fases no se invocan si un objetivo se invoca explícitamente.
El ciclo de vida es una secuencia de fases con nombre .
Las fases se ejecutan secuencialmente. Ejecutar una fase significa ejecutar todas las fases anteriores.Plugin es una colección de objetivos también llamada MOJO ( M aven O ld J ava O bject).
Analogía: el complemento es una clase y los objetivos son métodos dentro de la clase.
Maven se basa en el concepto central de Build Life Cycles . Dentro de cada Build Life Cycles hay Build Fases , y dentro de cada Build Fases hay Build Goals .
Podemos ejecutar una fase de construcción o un objetivo de construcción. Al ejecutar una fase de compilación, ejecutamos todos los objetivos de compilación dentro de esa fase de compilación. Los objetivos de construcción se asignan a una o más fases de construcción. También podemos ejecutar un objetivo de compilación directamente.
Hay tres principales ciclos de vida incorporados :
Cada ciclo de vida de construcción está compuesto de fases
Por ejemplo, el default
ciclo de vida se compone de las siguientes fases de compilación :
◾validate - validate the project is correct and all necessary information is available
◾compile - compile the source code of the project
◾test - test the compiled source code using a suitable unit testing framework. These tests should not require the code be packaged or deployed
◾package - take the compiled code and package it in its distributable format, such as a JAR.
◾integration-test - process and deploy the package if necessary into an environment where integration tests can be run
◾verify - run any checks to verify the package is valid and meets quality criteria
◾install - install the package into the local repository, for use as a dependency in other projects locally
◾deploy - done in an integration or release environment, copies the final package to the remote repository for sharing with other developers and projects.
Entonces, para pasar por las fases anteriores, solo tenemos que llamar a un comando:
mvn <phase> { Ex: mvn install }
Para el comando anterior, comenzando desde la primera fase, todas las fases se ejecutan secuencialmente hasta la fase de 'instalación'. mvn
puede ejecutar un objetivo o una fase (o incluso múltiples objetivos o múltiples fases) de la siguiente manera:
mvn clean install plugin:goal
Sin embargo, si desea personalizar el prefijo utilizado para hacer referencia a su complemento, puede especificar el prefijo directamente a través de un parámetro de configuración en el POM demaven-plugin-plugin
su complemento.
Una fase de compilación está compuesta por objetivos de complementos
La mayor parte de la funcionalidad de Maven está en complementos. Un complemento proporciona un conjunto de objetivos que se pueden ejecutar utilizando la siguiente sintaxis:
mvn [plugin-name]:[goal-name]
Por ejemplo, un proyecto Java puede compilarse con el objetivo de compilación del complemento del compilador ejecutando mvn compiler:compile
.
Build lifecycle es una lista de fases con nombre que se pueden usar para dar orden a la ejecución de objetivos.
Los objetivos proporcionados por los complementos pueden asociarse con diferentes fases del ciclo de vida. Por ejemplo, por defecto, el objetivo compiler:compile
está asociado con la compile
fase , mientras que el objetivo surefire:test
está asociado con la test
fase . Considere el siguiente comando:
mvn test
Cuando se ejecuta el comando anterior, Maven ejecuta todos los objetivos asociados con cada una de las fases hasta la test
fase incluida . En tal caso, Maven ejecuta el resources:resources
objetivo asociado con la process-resources
fase compiler:compile
, y así sucesivamente hasta que finalmente ejecuta el surefire:test
objetivo.
Sin embargo, aunque una fase de compilación es responsable de un paso específico en el ciclo de vida de la compilación, la forma en que lleva a cabo esas responsabilidades puede variar. Y esto se logra declarando los objetivos del complemento vinculados a esas fases de compilación.
Un objetivo de complemento representa una tarea específica (más fina que una fase de construcción) que contribuye a la construcción y gestión de un proyecto. Puede estar vinculado a cero o más fases de construcción. Un objetivo no vinculado a ninguna fase de compilación podría ejecutarse fuera del ciclo de vida de la compilación mediante invocación directa. El orden de ejecución depende del orden en que se invocan los objetivos y las fases de construcción. Por ejemplo, considere el siguiente comando. Los argumentos clean
y package
son fases de compilación, mientras que el dependency:copy-dependencies
es un objetivo (de un complemento).
mvn clean dependency:copy-dependencies package
Si esto se ejecutara, la clean
fase se ejecutará primero (lo que significa que ejecutará todas las fases anteriores del ciclo de vida limpio, más la clean
fase en sí), y luego el dependency:copy-dependencies
objetivo, antes de finalmente ejecutar la package
fase (y todas sus fases de construcción anteriores de El ciclo de vida predeterminado).
Además, si un objetivo está vinculado a una o más fases de construcción, ese objetivo se llamará en todas esas fases.
Además, una fase de construcción también puede tener cero o más objetivos vinculados. Si una fase de construcción no tiene objetivos vinculados, esa fase de construcción no se ejecutará. Pero si tiene uno o más objetivos vinculados, ejecutará todos esos objetivos.
Enlaces de ciclo de vida integrados
Algunas fases tienen objetivos vinculados por defecto. Y para el ciclo de vida predeterminado, estos enlaces dependen del valor del paquete.
Arquitectura Maven:
Muestra de Eclipse para Maven Lifecycle Mapping
[plugin-name]
en el ejemplo mvn [plugin-name]:[goal-name]
es más bien un prefijo de complemento . mvn clean install
no solo puede " usarse en un escenario de múltiples módulos ". El módulo múltiple es un tema totalmente diferente.
La respuesta elegida es excelente, pero aun así me gustaría agregar algo pequeño al tema. Una ilustración.
Demuestra claramente cómo las diferentes fases se unieron a diferentes complementos y los objetivos que exponen esos complementos.
Entonces, examinemos un caso de ejecutar algo como mvn compile
:
mvn compile
se asigna a un objetivo específico, el objetivo de compilación.mvn compiler:compile
Por lo tanto, la fase se compone de objetivos de complemento .
Enlace a la referencia
mvn test
apunta package
y mvn install
apunta deploy
?
jar
complemento realmente se ejecuta en la package
fase. Y el pom en el emparedado entre fases y complementos es un poco confuso (supongo que debería significar que en el pom puede configurar qué complementos se ejecutan en qué fases, además de los enlaces predeterminados). Sin embargo, el principio general es correcto.
Las definiciones se detallan en la página del sitio de Maven Introducción al ciclo de vida de la compilación , pero he intentado resumir :
Maven define 4 elementos de un proceso de construcción:
Ciclo vital
Tres ciclos de vida integrados (también conocidos como el ciclo de vida de construcción ): default
, clean
, site
. ( Referencia del ciclo de vida )
Fase
Cada ciclo de vida se compone de fases. , por ejemplo para el default
ciclo de vida: compile
, test
, package
, install
, etc.
Enchufar
Un artefacto que proporciona uno o más objetivos.
Según el tipo de embalaje (jar
, war
, etc.) objetivos plugins' están obligados a fases de forma predeterminada. ( Enlaces de ciclo de vida integrados )
Objetivo
La tarea (acción) que se ejecuta. Un complemento puede tener uno o más objetivos.
Es necesario especificar uno o más objetivos cuando configurar un complemento en un POM . Además, en caso de que un complemento no tenga una fase predeterminada definida, los objetivos especificados se pueden vincular a una fase.
Maven puede ser invocado con:
clean
,package
)<plugin-prefix>:<goal>
(p.ej dependency:copy-dependencies
)<plugin-group-id>:<plugin-artifact-id>[:<plugin-version>]:<goal>
(p.ej org.apache.maven.plugins:maven-compiler-plugin:3.7.0:compile
)con una o más combinaciones de cualquiera o todas, por ejemplo:
mvn clean dependency:copy-dependencies package
Build Phase
, lo considero como otra fase de un ciclo de vida y me confunde.
Creo que ya se proporciona una buena respuesta, pero me gustaría añadir un diagrama fácil de seguimiento de los diferentes ciclos de vida 3 ( build
, clean
y site
) y las fases en cada uno.
Las fases en negrita son las fases principales comúnmente utilizadas.
generate-resources
aparece dos veces y generate-sources
falta.
Crédito a Sandeep Jindal y Premraj. Su explicación me ayuda a comprender después de confundirme sobre esto por un tiempo.
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.
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 vs fase
Life Cycle es una colección de fases en secuencia, consulte aquí Life Cycle References . 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-limpieza, limpieza, post-limpieza ).
mvn clean
Se llamará pre-clean y clean .
2. Complemento vs Objetivo
El objetivo es como una acción en Plugin . 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" (Aquí nada se relaciona con la fase limpia. ¡No dejes que la palabra "limpio" te confunda, no son lo mismo!)
3. Ahora la relación entre Fase y Meta:
La fase puede (pre) vincularse a los objetivos . Por ejemplo, normalmente, la fase limpia se vincula a la meta limpia. Entonces, cuando llamas a este comando:
mvn clean
Llamará a la fase de pre-limpieza y a la fase de limpieza que se vincula con la meta clean: clean.
Es casi lo mismo que:
mvn pre-clean clean:clean
Más detalles y ejemplos completos se encuentran en https://www.surasint.com/maven-life-cycle-phase-and-goal-easy-explained/
La terminología de trabajo de Maven tiene fases y objetivos.
Fase: la fase Maven es un conjunto de acciones que se asocia con 2 o 3 objetivos.
ejemplo: - si ejecuta mvn clean
esta es la fase ejecutará el objetivo mvn clean: clean
Objetivo: objetivo de Maven limitado con la fase
para referencia http://books.sonatype.com/mvnref-book/reference/lifecycle-sect-structure.html
Existen los siguientes tres ciclos de vida integrados:
Ciclo de vida predeterminado -> [validar, inicializar, generar fuentes, fuentes de proceso, generar recursos, recursos de proceso, compilar, clases de proceso, generar fuentes de prueba, procesar fuentes de prueba, generar recursos de prueba, procesar -test-resources, test-compile, process-test-classes, test, prepare-package, package, pre-integración-test, prueba de integración, prueba posterior a la integración, verificar, instalar, implementar]
Ciclo de vida limpio -> [pre-limpieza, limpieza, post-limpieza]
Sitio del ciclo de vida -> [pre-sitio, sitio, post-sitio, despliegue de sitio]
El flujo es secuencial, por ejemplo, para el ciclo de vida predeterminado , comienza con validar , luego inicializar etc.
Puede verificar el ciclo de vida habilitando el modo de depuración, mvn
es decir,mvn -X <your_goal>