Maven es una excelente herramienta que nos permite simplificar el proceso de construcción de un proyecto (jar, ear, ejb, war, etc). La herramienta es tan poderosa que se ha convertido en una de mis favoritas, y la uso prácticamente todos los días. Alguna de las características que la han convertido en indispensable son:
- Se puede construir, ejecutar tests y empaquetar un proyecto con un solo comando.
- Permite administrar las dependencias de un proyecto de forma eficiente
- Permite unificar la estructura de los proyectos
- Permite generar una pagina web del proyecto con información general y con reportes variados relacionados al proyecto.
- Define una guia de buenas practicas de desarrollo
Quizás lo mas interesante es el primer punto ya que es lo que uno hace en el día a día. Por ejemplo, para generar un war el comando seria
$ mvn clean war:war
La definición del proyecto se hace en el archivo
pom.xml y debe estar ubicado en el directorio raíz del proyecto. Allí se define información general del proyecto así como todas las dependencias del mismo.
La instalación es bien sencilla:
- Bajar maven 2.0.x del site de Apache
- Unzip maven en algun directorio. Ejm: /home/usuario/maven
- Agregar al PATH el dir bin de maven.
export PATH=$PATH:/home/usuario/maven/bin:
- Agregar la variable MAVEN_OPTS al ambiente. Esta variable define parametros del JVM para maven.
$ export MAVEN_OPTS=-Xmx256M
- Crear el archivo settings.xml en el directorio {home}/.m2 del usuario. Este archivo contiene variables de configuración globales de MAVEN. A continuación se tiene un ejemplo del archivo
<settings>
<localRepository>/home/usuario/m2_local_repo</localRepository>
<proxies />
<servers />
<mirrors />
<profiles />
</settings>
- La entrada localRepository debe apuntar a donde estar el repositorio local de maven. Es aquí donde maven almacena todas las dependencias de nuestros proyectos.
- Probar la instalación
$ mvn --version
Maven version: 2.0.6
- Ahora solo falta crear el pom.xml de un proyecto y listo. Supongamos que tenemos un proyecto A que debe generar un war. El pom.xml puede ser como:
<?xml version="1.0" encoding="UTF-8"?>
<project>
<modelVersion>4.0.0</modelVersion>
<groupId>org.test.maven</groupId>
<artifactId>proyectoA</artifactId>
<packaging>war</packaging>
<name>Proyecto A</name>
<version>0.0.1</version>
<description>Test maven</description>
<dependencies>
<dependency>
<groupId>org.apache.geronimo.specs</groupId>
<artifactId>geronimo-j2ee_1.4_spec</artifactId>
<version>1.0</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring</artifactId>
<version>2.0.3</version>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.0.5</version>
</dependency>
<dependency>
<groupId>xerces</groupId>
<artifactId>xercesImpl</artifactId>
<version>2.8.1</version>
</dependency>
<dependency>
<groupId>commons-dbcp</groupId>
<artifactId>commons-dbcp</artifactId>
<version>1.2.1</version>
</dependency>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>3.8.1</version>
<scope>test</scope>
</dependency>
</dependencies>
</project>
- Fijense que se definieron varias dependencias como spring, mysql connectors, etc. Estas dependencias en principio no existen en nuestro proyecto pero al tratar de compilar con maven este se conectara a internet al repositorio global de maven y bajara las versiones de las dependencias que se especifican. El siguiente comando va a bajar las dependencias no presentes, compilar el proyecto, ejecutar cualquier test definido, generar el war y copiar el war en el repositorio local. El nombre del war será proyectoA-0.0.1.war y sera copiado dentro del repositorio local en la ruta definida por el groupId (org.test.maven)
$ mvn clean install
[INFO] Scanning for projects...
[INFO] ----------------------------------------------------------------------------
[INFO] Building Proyecto A
[INFO] task-segment: [clean, install]
[INFO] ----------------------------------------------------------------------------
[INFO] [clean:clean]
[INFO] Deleting directory /home/usuario/proyector/proyectoA/target
[INFO] Deleting directory /home/usuario/proyector/proyectoA/target/classes
[INFO] Deleting directory /home/usuario/proyector/proyectoA/target/test-classes
[INFO] [resources:resources]
[INFO] Using default encoding to copy filtered resources.
Downloading: http://repo1.maven.org/maven2/commons-dbcp/commons-dbcp/1.2.1/commons-dbcp-1.2.1.pom
6K downloaded
Downloading: http://repo1.maven.org/maven2/commons-dbcp/commons-dbcp/1.2.1/commons-dbcp-1.2.1.jar
105K downloaded
[INFO] [compiler:compile]
Compiling 8 source files to /home/usuario/proyector/proyectoA/target/target/classes
[INFO] [resources:testResources]
[INFO] Using default encoding to copy filtered resources.
[INFO] [compiler:testCompile]
Compiling 1 source file to /home/usuario/proyector/proyectoA/target/target/test-classes
[INFO] [surefire:test]
[INFO] Surefire report directory: /home/usuario/proyector/proyectoA/target/target/surefire-reports
-------------------------------------------------------
T E S T S
-------------------------------------------------------
Running test.TestUserDao
Tests run: 1, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 3.797 sec
Results :
Tests run: 1, Failures: 0, Errors: 0, Skipped: 0
[INFO] [war:war]
[INFO] Exploding webapp...
[INFO] Assembling webapp ProyectoA in /home/usuario/proyector/proyectoA/target/ProyectoA-0.0.1
[INFO] Copy webapp webResources to /home/usuario/proyector/proyectoA/target/ProyectoA-0.0.1
[INFO] Generating war /home/usuario/proyector/proyectoA/target/ProyectoA-0.0.1.war
[INFO] Building war: /home/usuario/proyector/proyectoA/target/ProyectoA-0.0.1.war
[INFO] [install:install]
[INFO] Installing /home/usuario/proyector/proyectoA/target/ProyectoA-0.0.1.war to /home/usuario/m2_local_repo/org/test/maven/ProyectoA/0.0.1/ProeyctoA-0.0.1
war
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESSFUL
[INFO] ------------------------------------------------------------------------
[INFO] Total time: 25 seconds
[INFO] Finished at: Fri Apr 06 18:37:46 EDT 2007
[INFO] Final Memory: 5M/15M
[INFO] ------------------------------------------------------------------------
Si se fijan bien, commons-dbcp no estaba disponible y fue bajado de internet antes de realizar la compilación, también se encontró un test que se ejecutó y funcionó correctamente y al final se generó el war y se publico en el repo local.
Como ven, es muy sencillo instalar, configurar y ejecutar maven. Después que uno se acostumbra a usarlo es difícil volver a ant o a otras herramientas similares. Para los que usan
netbeans o
eclipse existen
plugins que permiten usar maven desde el IDE.