¿Cuáles son los objetivos y fases de Maven y cuál es su diferencia?
¿Cuál es la diferencia/relación entre los objetivos y las fases de Maven? ¿Cómo se relacionan entre sí?
Los objetivos se ejecutan en fases, lo que ayuda a determinar el orden en que se ejecutan. La mejor comprensión de esto es observar los enlaces predeterminados del ciclo de vida de Maven , que muestran qué objetivos se ejecutan en qué fases de forma predeterminada. Los compile
objetivos de fase siempre se ejecutarán antes de los test
objetivos de fase, que siempre se ejecutarán antes de los package
objetivos de fase y así sucesivamente.
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, 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 ejecutar todos los objetivos adjuntos a esa fase.
Cuando crea una ejecución de complemento en su archivo de compilación de Maven y solo especifica el objetivo, vinculará ese objetivo a una fase predeterminada determinada. Por ejemplo, el jaxb:xjc
objetivo se vincula de forma predeterminada a la generate-resources
fase. 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, ejecutará ese objetivo y solo ese objetivo. En otras palabras, si especifica el jar:jar
objetivo, solo ejecutará el jar:jar
objetivo de empaquetar su código en un contenedor. Si no ha ejecutado previamente el objetivo de compilación o no ha preparado su código compilado de alguna otra manera, es muy probable que esto falle.
El ciclo de vida es una secuencia de fases nombradas .
Las fases se ejecutan secuencialmente. Ejecutar una fase significa ejecutar todas las fases anteriores.
El complemento es una colección de objetivos (es decir, tareas) que también se denomina MOJO ( M aven O ld J ava O bject).
Maven se basa en el concepto central de Build Life Cycles . Dentro de cada ciclo de vida de construcción hay fases de construcción , y dentro de cada fase de construcción hay objetivos de construcción .
Podemos ejecutar una fase de construcción o un objetivo de construcción. Al ejecutar una fase de construcción, ejecutamos todos los objetivos de construcción dentro de esa fase de construcción. Los objetivos de construcción se asignan a una o más fases de construcción. También podemos ejecutar un objetivo de construcción directamente.
Hay tres ciclos de vida de construcción integrados principales :
- por defecto
- limpio
- sitio
Cada ciclo de vida de construcción se compone de fases
Por ejemplo, el default
ciclo de vida consta 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, a partir de 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 de maven-plugin-plugin
su complemento.
Una fase de construcción se compone de objetivos de complementos
La mayor parte de la funcionalidad de Maven se encuentra 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 se puede compilar con el objetivo de compilación del complemento del compilador ejecutando mvn compiler:compile
.
El ciclo de vida de la compilación es una lista de fases con nombre que se pueden utilizar para ordenar la ejecución del objetivo.
Los objetivos proporcionados por los complementos se pueden asociar con diferentes fases del ciclo de vida. Por ejemplo, de forma predeterminada, el objetivo compiler:compile
está asociado a la compile
fase , mientras que el objetivo surefire:test
está asociado a 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 inclusive. En tal caso, Maven ejecuta el resources:resources
objetivo asociado con la process-resources
fase, luego compiler:compile
y así sucesivamente hasta que finalmente ejecuta el surefire:test
objetivo.
Sin embargo, aunque una fase de construcción es responsable de un paso específico en el ciclo de vida de la construcción, la manera en que lleva a cabo esas responsabilidades puede variar. Y esto se hace declarando los objetivos del complemento vinculados a esas fases de compilación.
El objetivo de un 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 que no esté vinculado a ninguna fase de construcción podría ejecutarse fuera del ciclo de vida de la construcció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 construcción, mientras que 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 misma), y luego el dependency:copy-dependencies
objetivo, antes de ejecutar finalmente la package
fase (y todas sus fases de compilació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 de forma predeterminada. Y para el ciclo de vida predeterminado, estos enlaces dependen del valor del paquete.
Arquitectura Maven:
Referencia 1
Referencia 2
Ejemplo de Eclipse para el mapeo del ciclo de vida de Maven
La respuesta elegida es excelente, pero aún así me gustaría agregar algo pequeño al tema. Una ilustración.
Demuestra claramente cómo las diferentes fases se vinculan a los diferentes complementos y los objetivos que exponen esos complementos.
Entonces, examinemos un caso de ejecución de algo como mvn compile
:
- Es una fase que ejecuta el complemento del compilador con el objetivo de compilar.
- El complemento del compilador tiene diferentes objetivos. Porque
mvn compile
está asignado 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 complementos .
Enlace a la referencia
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 resumirlas :
Maven define 4 elementos de un proceso de construcción:
Ciclo vital
Tres ciclos de vida integrados (también conocidos como ciclos de vida de compilació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 paquete (
jar
,,war
etc.), los objetivos de los complementos están vinculados a fases de forma predeterminada. ( Vínculos de ciclo de vida integrados )Meta
La tarea (acción) que se ejecuta. Un complemento puede tener uno o más objetivos.
Es necesario especificar uno o más objetivos al configurar un complemento en un POM . Además, en caso de que un complemento no tenga definida una fase predeterminada, los objetivos especificados se pueden vincular a una fase.
Maven se puede invocar con:
- una fase (por ejemplo
clean
, ,package
) <plugin-prefix>:<goal>
(p.ejdependency:copy-dependencies
)<plugin-group-id>:<plugin-artifact-id>[:<plugin-version>]:<goal>
(p.ejorg.apache.maven.plugins:maven-compiler-plugin:3.7.0:compile
)
con una o más combinaciones de cualquiera o todos, por ejemplo:
mvn clean dependency:copy-dependencies package