- 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.
- Agregar la variable MAVEN_OPTS al ambiente. Esta variable define parametros del JVM para maven.
- 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
- 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
- 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:
- 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)
export PATH=$PATH:/home/usuario/maven/bin:$ export MAVEN_OPTS=-Xmx256M<settings>
<localRepository>/home/usuario/m2_local_repo</localRepository>
<proxies />
<servers />
<mirrors />
<profiles />
</settings>
$ mvn --version
Maven version: 2.0.6
<?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>
$ 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] ------------------------------------------------------------------------
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.