MAVEN Lifecycle

10/06/2016

Maven

Fundamentos básicos del ciclo de vida de la construcción

Maven se fundamenta en el concepto central de ciclo de vida de construcción (build lifecycle). Esto significa que el proceso de construcción y distribución de un artifact (artefacto = proyecto) concreto está definido claramente.

Para la persona que quiera construir un proyecto significa que solamente es necesario aprender un pequeño conjunto de comandos para construir cualquier proyecto Maven, y el POM se asegurará de que obtenga los resultados deseados.

Existen tres ciclos de vida en el sistema: default, clean y site. El ciclo de vida default controla el despliegue de tu proyecto, el ciclo de vida clean controla la limpieza de tu proyecto, mientras que el ciclo de vida site controla la creación del site de documentación de tu proyecto.

Un ciclo de vida de construcción se compone de fases

Cada uno es estos ciclos de vida de construcción está definido por una lista diferente de fases (phases), donde cada fase representa un estado en el ciclo de vida.

Maven_LifeCycle_TableCada una de estas fases se ejecutan secuencialmente para completar el ciclo de vida.

Si, por ejemplo, invocamos la ejecución de la fase deploy del ciclo de vida default:

mvn deploy

esta invocación también provocará la ejecución de todas las fases que la preceden.

Una fase de construcción se compone de objetivos de plugins

Sin embargo, aunque una fase de construcción es responsable de un paso específico en el ciclo de vida de construcción, el modo en que este se lleva a cabo puede variar. Esto se consigue declarando objetivos (goals) de plugins asociados a fases de construcción.

simple-project_lifecyclebinding

Un objetivo de un plugin representa una tarea específica que contribuye en la construcción y gestión de un proyecto. Puede estar asociada a cero o más fases de construcción. Un objetivo que no esté asociado a ninguna fase podría ejecutarse fuera del ciclo de vida de construcción mediante la invocación directa. El orden de ejecución depende del orden en el que los objetivos y las fases de construcción sean invocados. Pongamos como ejemplo el comando de más abajo. Los argumentos clean y package son fases de construcción, mientras que dependency:copy-dependencies es un objetivo (de un plugin).

mvn clean dependency:copy-dependencies package

Si lo ejecutásemos, la fase clean se ejecutaría primero (lo cual quiere decir que ejecutará todas las fases precedentes del ciclo de vida clean, además del la propia fase clean), y luego el objetivo dependency:copy-dependencies, antes de ejecutar finalmente la fase package (y todas sus fases precedentes del ciclo de vida default).

Configurando tu proyecto para que utilice el ciclo de vida de construcción

El ciclo de vida de construcción es suficientemente simple para poder usarlo, pero cuando estás definiendo una construcción Maven para un proyecto, ¿cómo hacemos para asignar tareas a cada una de esas fases de construcción?

Empaquetado

El primer modo, y más común, consiste en establecer el empaquetado de tu proyecto en el elemento <packaging> del POM. Algunos de los valores válidos de packaging son jar, war, ear y pom. Si no se especifica packaging, por defecto es jar.

Cada empaquetado contienen una lista de objetivos a asociar con una determinada fase. Por ejemplo, el empaquetado jar asociará los siguientes objetivos a la fases de construcción del ciclo de vida default.

process-resources resources:resources
compile compiler:compile
process-test-resources resources:testResources
test-compile compiler:testCompile
test surefire:test
package jar:jar
install install:install
deploy deploy:deploy

Este es, casi, un conjunto estándar de asociaciones; sin embargo, algunos empaquetados las tratan de modo diferente. Por ejemplo, un proyecto que solamente contiene metainformación (cuyo valor de packaging es pom) solamente asocia objetivos a las fases de install y deploy.

Plugins

La segunda forma de añadir objetivos a las fases consiste en configurar plugins en tu proyecto. Los plugins son artefactos que proporcionan objetivos a Maven. Es más, un plugin puede tener uno o mas objetivos donde cada objetivo representa una capacidad de dicho plugin. Por ejemplo, el plugin Compiler tiene dos objetivos: compile y testCompile. El primero compila el código fuente de tu código principal, mientras que el segundo compila el código fuente de tu código de test.

Los plugins pueden contener información que indique la fase del ciclo de vida a la que asociar un objetivo. Además, es importante saber que el simple hecho de solamente añadir un plugin no es suficiente información – además debes especificar los objetivos que quieres ejecutar como parte de tu construcción.

Los objetivos configurados se añadirán a los objetivos ya asociados al ciclo de vida gracias a la selección de empaquetado. Si se asocia más de un objetivo a una fase particular, el orden usado consiste en ejecutar primero los del empaquetado y después los configurados en el POM. También se puede utilizar el elemento <executions> para tener un mayor control del orden particular de los objetivos.

Por ejemplo, el plugin JAXB2, asocia por defecto su objetivo jaxb2:xjc a la fase generate-sources (Nota: El objetivo jaxb2.xjc genera código Java a partir de esquemas XML). Así que para utilizar el plugin JAXB2 y usarlo para generar fuentes a partir de un esquema XML e incorporarlos a la construcción, añadiríamos lo siguiente a nuestro POM en <plugins> de la sección <build> :

...
            <plugin>
                <groupId>org.codehaus.mojo</groupId>
                <artifactId>jaxb2-maven-plugin</artifactId>
                <version>1.6</version>
                <executions>
                    <execution>
                        <configuration>
                            <schemaDirectory>${project.basedir}/src/main/resources/xsd/</schemaDirectory>
                            <bindingDirectory>${project.basedir}/src/main/resources/xjb/</bindingDirectory>
                        </configuration>
                        <goals>
                            <goal>xjc</goal>
                        </goals>
                    </execution>
                </executions>
            </plugin>
...

El elemento <executions>, si es necesario, permite ejecutar el mismo objetivo múltiples veces con diferentes configuraciones. Las diferentes ejecuciones además pueden tener un ID para que, durante la herencia o el uso de perfiles, puedas controlar si la configuración de un objetivo ha de ser mezclada o convertida en una ejecución adicional.

Cuando se dan múltiples ejecuciones para una misma fase, se ejecutan en el orden definido en el POM, con las ejecuciones heredadas ejecutándose primero.

Aunque en el caso de jaxb2:xjc solamente tiene sentido en la fase generate-sources, algunos objetivos se pueden utilizar en más de una fase y pueden no tener una fase por defecto. En ese caso, puedes especificar la fase. Por ejemplo, digamos que tenemos el objetivo display:time que escribe la fecha actual en la línea de comandos, y que queremos ejecutarlo en la fase process-test-resources para indicar el momento en el que comenzó la ejecución de los test. Lo podríamos configurar del siguiente modo:

...
 <plugin>
   <groupId>com.mycompany.example</groupId>
   <artifactId>display-maven-plugin</artifactId>
   <version>1.0</version>
   <executions>
     <execution>
       <phase>process-test-resources</phase>
       <goals>
         <goal>time</goal>
       </goals>
     </execution>
   </executions>
 </plugin>
...

Responder

Introduce tus datos o haz clic en un icono para iniciar sesión:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Cerrar sesión / Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Cerrar sesión / Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Cerrar sesión / Cambiar )

Google+ photo

Estás comentando usando tu cuenta de Google+. Cerrar sesión / Cambiar )

Conectando a %s

A %d blogueros les gusta esto: