
Primer contacto con Maven
10 Julio 2008Estoy probando Maven como sistema de construcción, y me ha causado una muy buena sensación. Si se ha trabajado anteriormente con Ant, será más sencillo.
Para empezar con Maven, hay que tener instalado un JDK y tener definida la variable de entorno JAVA_HOME.
Maven se puede descargar aquí. Sólo hay que descomprimir el contenido y añadir el directorio ‘bin’ al path.
La documentación de Maven tiene una guía breve de funcionamiento, que es recomendable seguir la primera vez.
Maven propone una estructura de directorios que facilita su uso, siguiendo el principio “convention over configuration”. Esta estructura es la siguiente:
| src/main/java | Application/Library sources |
| src/main/resources | Application/Library resources |
| src/main/filters | Resource filter files |
| src/main/assembly | Assembly descriptors |
| src/main/config | Configuration files |
| src/main/webapp | Web application sources |
| src/test/java | Test sources |
| src/test/resources | Test resources |
| src/test/filters | Test resource filter files |
| src/site | Site |
| LICENSE.txt | Project’s license |
| README.txt | Project’s readme |
Si no se sigue esta estructura, la configuración será más compleja.
En la raíz de esta estructura, debe existir el archivo pom.xml, que contiene los detalles para realizar la construcción. Un ejemplo sencillo es el siguiente:
<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>my.project</groupId>
<artifactId>myProject</artifactId>
<packaging>war</packaging>
<version>1.0-SNAPSHOT</version>
<name>myProject</name>
<url>http://www.myproject.com</url>
<properties>
<!-- Aunque fallen los test, continuar con la construccion -->
<maven.test.failure.ignore>true</maven.test.failure.ignore>
</properties>
<dependencies>
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>servlet-api</artifactId>
<version>2.3</version>
<!-- Dependencia necesaria para compilar, pero que no se debe
empaquetar porque el entorno de despliegue la prove -->
<scope>provided</scope>
</dependency>
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>jstl</artifactId>
<version>1.1.2</version>
</dependency>
<dependency>
<groupId>taglibs</groupId>
<artifactId>standard</artifactId>
<version>1.1.2</version>
</dependency>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>3.8.1</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring</artifactId>
<version>2.0.4</version>
</dependency>
<dependency>
<groupId>org.hibernate</groupId>
<artifactId>hibernate</artifactId>
<version>3.2.6.ga</version>
</dependency>
<dependency>
<groupId>org.hsqldb</groupId>
<artifactId>hsqldb</artifactId>
<version>1.8.0.10</version>
</dependency>
</dependencies>
<build>
<resources>
<-- Especificamos los resources porque no se
encuentran en el lugar por defecto de Maven -->
<resource>
<directory>src/main/java</directory>
<includes>
<include>**/*.xml</include>
<include>**/*.properties</include>
</includes>
</resource>
</resources>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<configuration>
<source>1.6</source>
<target>1.6</target>
<fork>true</fork>
<!-- Especificamos la version del compilador para Maven
tenga soporte para generics, anotations, etc, por defecto no tiene-->
<compilerVersion>1.6</compilerVersion>
<!-- A portable way using environment variables -->
<executable>${JAVA_HOME}/bin/javac</executable>
</configuration>
</plugin>
</plugins>
</build>
</project>
Una vez tenemos la configuración del POM,podemos ejecutar diferentes tareas, según convenga:
Para compilar:
> mvn compile
Para compilar y ejecutar los tests:
> mvn test
Para compilar, ejecutar los tests y crear el JAR ó WAR:
> mvn package
Para desplegar en Tomcat un WAR:
> mvn tomcat:run
Ventajas que aporta Maven:
- No hay que adjuntar las librerías en un directorio /lib, sólo declararlas y él se encarga de mantenerlas en el repositorio local y añadirlas según convenga.
- Estandarización de la estructura de un proyecto. Todos los proyectos se organizan de forma predecible.
- Encapsula tareas Ant, de forma que la configuración es más simple que mediante archivos build.xml.
- Promueve buenas prácticas, pero permite flexibilidad, de manera que se adapta a cualquier situación y ayuda a mejorar.
Actualizado
Si se utiliza Maven sobre proyectos existentes, es muy probable que no se tenga la estructura de directorios que usa Maven por defecto. Para configurar la estructura de directorios se debe especificar de la siguiente manera:
...
<build>
<sourceDirectory>${project.basedir}/src</sourceDirectory>
<outputDirectory>${project.build.directory}/classes</outputDirectory>
<testSourceDirectory>${project.basedir}/test</testSourceDirectory>
<testOutputDirectory>${project.build.directory}/testclasses</testOutputDirectory>
<resources>
<resource>
<directory>${project.basedir}/src</directory>
<includes>
<include>**/*.xml</include>
<include>**/*.properties</include>
</includes>
</resource>
</resources>
...