Introducción a Maven
Es una herramienta de la Apache Software Foundation especializada en gestionar el ciclo de vida de proyectos de software, cuya filosofía es proporcionar un esquema consistente para la ejecución de las diversas fases de la construcción del software, desde la creación del proyecto en sí, hasta distribución del o los componentes producto del proyecto.
Dentro de la principales características que hacen de maven una potente herramienta para la gestión de proyectos de software se encuentran las siguientes.
- Complemento evolutivo de Apache Ant. Los programadores que ya cuentan con algunos años de experiencia en Java, sabrán que Apache Ant ha sido la herramienta de construcción de uso más extendido para la tecnología Java. Maven, no es un sustituto de Ant sino un complemento, de hecho maven se vale de Ant tras bambalinas para llevar a cabo su labor.
- Convención sobre la configuración. Para proporcionar consistencia a las tareas de gestión maven establece una serie de convenciones para la estructura de proyectos, el nombrado de comandos, etc. De esta manera un proyecto creado en maven es válido en cualquier equipo y los comandos para compilarlo, empaquetarlo, construirlo, etc., siempre serán los mismos.
-
Estructura jerárquica de las fases del ciclo de vida de construcción del proyecto.
- compile
- test
- package
- install
- deploy
packagese realizará una verificación para comprobar si los comandos compile y test ya han sido ejecutados, de lo contrario se ejecutarán en orden jerárquico. -
Descripción centralizada de los proyectos a través del POM (Project Object Model), el cual es un archivo XML nombrado pom.xml en dónde podemos definir los diferentes matices de nuestro producto, información descriptiva del proyecto como nombre, grupo y versión, definición de dependencias, plugins a utilizar para extender funcionalidad, módulos que conforman el proyecto, perfiles de construcción e incluso información referente al equipo de desarrollo.
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd"> <modelVersion>4.0.0</modelVersion> <groupId>org.yaxche.blog</groupId> <artifactId>org.yaxche.blog.springtiles</artifactId> <packaging>war</packaging> <version>1.0-SNAPSHOT</version> <name>org.yaxche.blog.springtiles Maven Webapp</name> <url>http://maven.apache.org</url> <properties> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> </properties> ... </project>Arriba vemos un ejemplo de un archivo pom.xml donde definimos el artifactId o identificador de proyecto, groupId o identificador del grupo de proyectos al cual pertenece nuestro proyecto el tipo de empaquetamiento (packaging) en este caso war. Más adelante veremos algunos otros contenidos del archivo POM.
-
Gestión de dependencias. Maven proporciona un repositorio central con las diferentes distribuciones de la gran mayoría de los proyectos open source actuales organizados por proveedor, grupo y versión. De esta manera desde nuestros proyectos basta con definir la dependencia que necesitamos y maven se encargará de resolverla. Con el paso del tiempo han surgido repositorios que nacieron como réplicas y/o complemento del repositorio central maven por ejemplo el repositorio de Red Hat – Jboss. A propósito de esto cabe destacar que maven permite la creación de repositorios basados en niveles jerárquicos. Por ejemplo, podemos crear el repositorio de nuestra empresa con los proyectos que al interior de los mismo se van generando. De hecho cuando comenzamos a utilizar maven en nuestro equipo se va generando un repositorio local que será el primer lugar en dónde maven busque resolver una dependencia.
... <dependencies> <dependency> <groupId>org.apache.tiles</groupId> <artifactId>tiles-jsp</artifactId> <version>2.2.2</version> <type>jar</type> <scope>compile</scope> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-webmvc</artifactId> <version>3.0.5.RELEASE</version> <type>jar</type> <scope>compile</scope> </dependency> <dependency> <groupId>org.slf4j</groupId> <artifactId>slf4j-jdk14</artifactId> <version>1.5.8</version> <type>jar</type> <scope>compile</scope> </dependency> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>4.6</version> <scope>test</scope> </dependency> </dependencies> ...En el código anterior se muestra el segmento del archivo POM en dónde definimos las dependencias de nuestro proyecto. Como se nota es básico especificar el
artifactIdy elgroupIddel proyecto del cual dependemos, además de la versión del mismo. Por otro lado destacar que podemos definir diferentes niveles de alcance para las dependencias en el ejemplo vemos dependencias de "compilación"<scope>compile</scope>lo cual significa que esas dependencias son necesarias para la fase de compilación del proyecto y también vemos dependencias específicas para la fase de compilación y comprobación de pruebas unitarias "test". -
Esquema de plugins para extensión de la funcionalidad, así como se pueden definir la dependencias, también se pueden especificar plugins para añadir funcionalidad al ciclo de vida.
... <build> <plugins> <plugin> <groupId>org.codehaus.mojo</groupId> <artifactId>jasperreports-maven-plugin</artifactId> <version>1.0-beta-2</version> <executions> <execution> <phase>process-classes</phase> <goals> <goal>compile-reports</goal> </goals> </execution> </executions> <dependencies> <dependency> <groupId>net.sf.jasperreports</groupId> <artifactId>jasperreports</artifactId> <version>3.7.2</version> <type>jar</type> </dependency> <dependency> <groupId>log4j</groupId> <artifactId>log4j</artifactId> <version>1.2.15</version> <exclusions> <exclusion> <groupId>javax.mail</groupId> <artifactId>mail</artifactId> </exclusion> <exclusion> <groupId>javax.jms</groupId> <artifactId>jms</artifactId> </exclusion> <exclusion> <groupId>com.sun.jdmk</groupId> <artifactId>jmxtools</artifactId> </exclusion> <exclusion> <groupId>com.sun.jmx</groupId> <artifactId>jmxri</artifactId> </exclusion> </exclusions> </dependency> </dependencies> </plugin> </plugins> </build> ...Ahora vemos un ejemplo del código para agrergar extensiones funcionales (plugins) a maven, en este caso se agrega la dependencia para agregar a la fase de compilación, la compilación de archivos de reportes de JasperReports. Como este ejemplo existe una gran variedad de plugins para extender la funcionalidad de maven.
Como se ve maven es una herramienta orientada a simplificar el proceso de construcción de nuestras aplicaciones a la vez que nos promueve a mantener consistencia en la estructura de nuestros proyectos de software, además proporciona gestión de dependencias una de sus características más destacables.
