Herramienta de gestión y construcción de proyectos - Maven --- * **Coordinador Tecnológico:** Rafael Palau * **Arquitecto:** Horacio Nemeth * **Consultores:** Julio Mello Marcos Benítez Marco Aquino Ilse Grau Alan Sanier Lauro Segovia [TOC] ### Maven Es una poderosa herramienta para gestionar proyectos de software en Java. También puedes usar otros lenguajes para crear proyectos de software, pero Maven está desarrollado en Java, por lo que históricamente se usa más para proyectos Java. --- ### POM Maven se centra en el concepto de archivos POM (Project Object Model). Un archivo POM es una representación XML de información del proyecto, como código fuente, código de prueba, dependencias , etc. El POM contiene referencias a todos estos recursos. El archivo POM debe estar ubicado en el directorio raíz del proyecto al cual pertenece. --- ### POM Esquema del contenido del pom.xml ![](https://i.imgur.com/kKfOvii.jpg) <em>Figura: Contenido del pom.xml</em> --- ### POM ##### Build Life Cycles, Phases and Goals El proceso de construcción en Maven se divide en ciclo de vida de construcción, *fases* (Phases) y *objetivos* (Goals). Un ciclo de vida de la construcción se compone de una serie de fases de construcción, y cada fase de construcción se compone de una serie de objetivos. --- ### POM ##### Dependencies and Repositories Uno de los primeros *objetivos* que ejecuta Maven es comprobar las dependencias que necesita el proyecto. Las dependencias son archivos JAR externos (bibliotecas Java) que el proyecto utiliza. Si las dependencias no se encuentran en el *repositorio local* de Maven, Maven las descarga de un *repositorio central* de Maven y las pone en el repositorio local --- ### POM ##### Build Plugins El complemento de compilación (Plugins) se utiliza para insertar objetivos (Goals) adicionales durante la fase de construcción. Maven tiene algunos complementos predefinidos que pueden ser utilizados y, si es necesario, también se puede implementar complementos personalizados en Java. --- ### POM ##### Build Profiles En caso de necesitar crear un proyecto de forma diferente, es necesario la utilización de un *perfil* (Profiles) de construcción. Por ejemplo, cuando se necesite crear un proyecto para el entorno local, test o producción. --- ### Maven Repositories El repositorio maven es un directorio de archivos que contiene *jar* empaquetados con metadatos adicionales. Los metadatos son archivos *pom* que describen los proyectos a los que pertenece cada archivo *jar*, incluyendo qué dependencias externas tiene cada JAR empaquetado. --- ### Maven Repositories Maven cuenta con tres tipos de repositorio: * **Local** : es un repositorio alojado en la maquina de ejecución, por lo general esta ubicado en el directorio **$HOME./m2** * **Central** : es un repositorio externo proporcionado por la comunidad del Maven * **Externo** : Es un repositorio remoto que se ejecuta en un servidor web, que posibilita la descarga de dependencias --- ### Ejemplo de configuración ```shell= <repositories> <repository> <id>central</id> <name>Maven Repository</name> <url>http://repo1.maven.org/maven2</url> </repository> </repositories> ``` --- ### Ejemplo repositorio local ![](https://i.imgur.com/h3wF7E6.png) <em>Figura: Captura de pantalla de ubicación de repositorio local</em> --- ### Ejemplo repositorio central ![](https://i.imgur.com/dRdKTUc.png) <em>Figura: Captura de pantalla del repositorio central</em> --- ### Ejemplo repositorio central ![](https://i.imgur.com/kt3xfFU.png) <em>Figura: Captura de pantalla del repositorio *externo siare*</em> --- ### Ejemplo de Dependencia del proyecto ![](https://i.imgur.com/Uo2RqyS.png) <em>Figura: Captura de pantalla de configuración de dependencias</em> ### Ejemplo listado de dependencias * `mvn dependency:tree` ![](https://i.imgur.com/UmJGldC.png) <em>Figura: Captura de pantalla de listado de dependencias</em> --- ### Maven Build Life Cycles, Phases and Goals Maven se basa en el concepto de ciclo de vida de construcción. Esto significa que el proceso de construcción y distribución de un artefacto (proyecto) está claramente definido --- ### Build Life Cycle Maven cuenta con tres tipos de ciclo de vida de construcción: * **default** : Ciclo de vida que gestiona la construcción, empaquetamiento y despliegue. * **clean** : Ciclo de vida que gestiona la limpieza del espacio de trabajo * **site** : Ciclo de vida que gestiona la creación del sitio web del maven (documentaciones) --- ### Build Life Cycle - Phases Cada ciclo de vida de construcción define una lista de fases, en la que una fase de la construcción representa una etapa del ciclo de vida. Por ejemplo, el ciclo de vida por defecto consta de las siguientes fases : --- ### Build Life Cycle - Phases | Fase| Descripción | | ------ | ------ | | validate | valida el proyecto y si cuenta con toda la información necesaria para la construcción del proyecto | | compile | compila el código fuente del proyecto| | test | realiza las pruebas unitarias del proyecto| --- ### Build Life Cycle - Phases | Fase| Descripción | | ------ | ------ | | package | toma el código compilado y lo empaqueta conforme al formato configurado en el *pom* ej: *jar* | | verify | ejecuta las pruebas de integración del proyecto| | install | instala el empaquetado del proyecto en el repositorio local| --- ### Build Life Cycle - Phases | Fase| Descripción | | ------ | ------ | | deploy | copia el empaquetado del proyecto al servidor remoto | --- ### Build Life Cycle - Phases Cada ciclo de vida es dividio en secuencias de fases y cada fases también estan subdivididas en objetivos. ![](https://i.imgur.com/4IJCji7.jpg) <em>Figura: Listado de fases y objetivos</em> --- ### Build Life Cycle - Default ![](https://i.imgur.com/9pPyueE.png) <em>Figura: Esquema de fases y objetivos del ciclo de vida *default*</em> --- ### Build Life Cycle - Clean ![](https://i.imgur.com/IAt3FMR.png) <em>Figura: Esquema de fases y objetivos del ciclo de vida *clean*</em> --- ### Build Life Cycle - Site ![](https://i.imgur.com/gQYe6x3.png) <em>Figura: Esquema de fases y objetivos del ciclo de vida *site*</em> --- ### Build Life Cycle - Phases Se puede ejecutar un ciclo por ejemplo **clean** o **site** con diferentes fases por ejemplo la fase de **install** que es parte del ciclo de vida de construcción **default** * `mvn clean install` --- ### Ejemplo de comandos | comando | Descripción | | ------ | ------ | | mvn install | Construye el proyecto conforme al *pom.xml* configurado y lo agrega al repositorio local| | mvn clean | Limpia el espacio de trabajo del maven, el directorio utilizado es **proyecto/target**| | mvn package | Construye el proyecto y lo copia al espacio de trabajo **proyecto/target**| --- ### Trabajando con plugins El maven provee un conjunto de plugins para facilitar el proces de construcción de proyectos. * El plugins *maven-jar-plugin*, permite gestionar el empaquetado del proyecto en un **.jar**. Así también agregar propiedades al archivo generado --- ### Trabajando con plugins - jar * Para utilizar un plugins es necesario definirlo dentro del archivo *pom.xml* del proyecto : ![](https://i.imgur.com/2X0wC7P.png) <em>Figura: Captura de pantalla de configuración de plugins *jar*</em> --- ### Trabajando con plugins - jar * Con la configuración anterior se agrega dos propiedades al manifest del paquete **.jar** generado que son: * **Permissions** * **Application-Name** * **manifest** * Para poder ejecutar la acción configurada se debe utilizar el siguiente comando: * `mvn clean package` ---- #### Resultado ![](https://i.imgur.com/Wr8X0p3.png) --- ### Trabajando con plugins - dependency ![](https://i.imgur.com/2NeuRhC.png) <em>Figura: Captura de pantalla de configuración de plugins *dependency*</em> --- ### Trabajando con plugins - dependency * En la configuración anterior se agrega la accion de copia de librerías externas a un directorio especifico: * La fase utilizada es **package** y el objetivo es **copy-dependencies** * `mvn clean package` ---- #### Resultado ![](https://i.imgur.com/FrOVeJd.png) --- ### Arquetipo (Archetype) Es un conjunto de herramientas para proveer plantillas de proyectos maven. Un arquetipo se define como un patrón o modelo original a partir del cual se generan proyectos del mismo tipo. Los arquetipos ayudan en la estandarización y organización de los proyectos generados. --- ### Estructura del proyecto Maven ##### Arquetipo **Quickstart** ```shell= mvn archetype:generate -DarchetypeGroupId=org.apache.maven.archetypes -DarchetypeArtifactId=maven-archetype-quickstart -DarchetypeVersion=1.4 ``` *El comando del maven **mvn** puede ser utilizado desde una terminal, para ello se debe de configurar dentro de la variable de entorno **PATH** del equipo. El proyecto Maven es independiente del IDE que utilicemos* --- ### Estructura del proyecto Maven ##### Arquetipo **Quickstart** ![](https://i.imgur.com/476okWE.png) <em>Figura: estructura del arquetipo maven quickstart </em> --- ### Referencias * [Ciclo de vida Maven](https://maven.apache.org/guides/introduction/introduction-to-the-lifecycle.html#Built-in_Lifecycle_Bindings) * [Esquema - Ciclo de vida](https://medium.com/@yetanothersoftwareengineer/maven-lifecycle-phases-plugins-and-goals-25d8e33fa22)
{"metaMigratedAt":"2023-06-16T16:23:39.605Z","metaMigratedFrom":"YAML","title":"Maven","breaks":true,"description":"Build tool","slideOptions":"{\"transition\":\"slide\"}","contributors":"[{\"id\":\"e91465d8-053e-4b6c-9d94-c55eaa5843ee\",\"add\":12765,\"del\":11005}]"}
    1006 views