h1

Primer contacto con Maven

10 Julio 2008

Estoy 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>
...

Dejar un comentario