¿Cuáles son los objetivos y fases de Maven y cuál es su diferencia?

Respuestas:

251

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.

Paso
fuente
11
Me he acostumbrado a decir "Maven pasa todas las fases (hasta la incluida)" en lugar de "ejecuta" o "ejecuta" (este último, como se llama en la Introducción de Maven al ciclo de vida de la construcción ). Tal distinción es más clara del código de la meta que realmente se ejecuta. Pero eso podría ser un gusto personal.
GeroldBroser reincorpora a Mónica el
Pero también podemos ejecutar objetivos que no pertenecen a ninguna fase, es decir mvn archetype:generate, y en ese caso, Maven solo ejecuta el objetivo.
Quazi Irfan
1
@Pace ¿Tiene una referencia para el último párrafo? He estado dudando de eso y lo intenté con un proyecto simple aquí: mvn testejecuta:, --- 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:testmientras que mvn compiler:testCompilesolo se ejecuta --- maven-compiler-plugin:3.1:testCompile ....
GeroldBroser reintegra a Mónica
44
@Pace se mvn clean compiler:testCompileejecuta --- maven-clean-plugin:2.5:clean ... --- maven-compiler-plugin:3.1:testCompiley 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 MvnPhasees la clase bajo prueba referenciada en la clase de prueba). Aparentemente, las fases no se invocan si un objetivo se invoca explícitamente.
GeroldBroser reintegra a Mónica
1
Basado en la información de geroldbroser y @ kekko12, he actualizado el último párrafo para indicar que, cuando se especifica un objetivo, solo se ejecuta ese objetivo, y no todas las fases anteriores.
Paso
188

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 :

  1. defecto
  2. limpiar
  3. sitio

Cada ciclo de vida de construcción está compuesto de fases

Por ejemplo, el defaultciclo 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'. mvnpuede 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 testfase incluida . En tal caso, Maven ejecuta el resources:resourcesobjetivo asociado con la process-resourcesfase compiler:compile, y así sucesivamente hasta que finalmente ejecuta el surefire:testobjetivo.

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 cleany packageson fases de compilación, mientras que el dependency:copy-dependencieses un objetivo (de un complemento).

mvn clean dependency:copy-dependencies package

Si esto se ejecutara, la cleanfase se ejecutará primero (lo que significa que ejecutará todas las fases anteriores del ciclo de vida limpio, más la cleanfase en sí), y luego el dependency:copy-dependenciesobjetivo, antes de finalmente ejecutar la packagefase (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:

ingrese la descripción de la imagen aquí

Referencia 1
Referencia 2

Muestra de Eclipse para Maven Lifecycle Mapping

Muestra de Eclipse para Maven Lifecycle Mapping

Premraj
fuente
Si tengo 2 perfiles, ¿puedo ejecutar primero todos los complementos del perfil 1 y luego el del perfil 2?
Abeja
[plugin-name]en el ejemplo mvn [plugin-name]:[goal-name]es más bien un prefijo de complemento . mvn clean installno solo puede " usarse en un escenario de múltiples módulos ". El módulo múltiple es un tema totalmente diferente.
GeroldBroser reintegra a Mónica
¿Los objetivos vinculados a la misma fase acatan alguna orden?
anguila ghEEz
55
La mayor parte de este texto se copia literalmente de la documentación de Maven . ¡Esto debería estar claramente establecido!
Lii
fuente impresionante!
Bobo
45

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:

  • Es una fase que ejecuta el complemento del compilador con el objetivo de compilación
  • El complemento del compilador tiene diferentes objetivos. Porque mvn compilese asigna a un objetivo específico, el objetivo de compilación.
  • Es lo mismo que correr mvn compiler:compile

Por lo tanto, la fase se compone de objetivos de complemento .

ingrese la descripción de la imagen aquí

Enlace a la referencia

Johnny
fuente
20
¿Por qué mvn testapunta packagey mvn installapunta deploy?
Abdull
2
Parece un error de ilustración, gracias por notarlo (fundado en la web).
Johnny
3
¿De dónde sacaste la ilustración? ¿Revisaste los derechos de autor y los términos de uso?
Abdull
1
@Abdull imagen tomada desde aquí carminespagnuolo.eu/otheractivities/tutorato/PR-2014-2015/… (y también aparece en muchas otras páginas web) agregándola a la respuesta. Gracias por plantear este punto, no era consciente de la importancia del mismo.
Johnny
1
Los punteros de las fases a los complementos en el diagrama tampoco son del todo correctos, el jarcomplemento realmente se ejecuta en la packagefase. 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.
Alexander Klimetschek
43

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:

  1. 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 )

  2. Fase

    Cada ciclo de vida se compone de fases. , por ejemplo para el defaultciclo de vida: compile, test, package, install, etc.

  3. 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 )

  4. 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:

  1. una fase (por ejemplo clean,package )
  2. <plugin-prefix>:<goal> (p.ej dependency:copy-dependencies )
  3. <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
Sandeep Jindal
fuente
Solo las fases del ciclo de vida tienen sentido para ser consideradas como "pasos" (de un proceso de compilación). Prefiero llamarlo 4 entidades / artículos / cosas .
GeroldBroser reincorpora a Mónica el
Cuando veo el mundo Build Phase, lo considero como otra fase de un ciclo de vida y me confunde.
Quazi Irfan
26

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, cleany site) y las fases en cada uno.

ingrese la descripción de la imagen aquí

Las fases en negrita son las fases principales comúnmente utilizadas.

Lior Bar-On
fuente
2
generate-resourcesaparece dos veces y generate-sourcesfalta.
elingerojo
12

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:

  • Ciclo de vida vs fase
  • Plugin vs Goal

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/

Surasin Tancharoen
fuente
2

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

Venky Vungarala
fuente
44
No tiene que estar "asociado con 2 o 3 goles" necesariamente. Puede ser ninguno , uno o más de tres , también.
GeroldBroser reincorpora a Mónica el
1

Existen los siguientes tres ciclos de vida integrados:

  • defecto
  • limpiar
  • sitio

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, mvnes decir,mvn -X <your_goal>

Vishrant
fuente