El fichero pom.xml es el fichero clave de los proyectos basados en Maven (igual que ant se basaba en build.xml). Es el encargado de indicar las diferentes dependencias a nivel de proyecto, posibles tareas que se pueden realizar con el proyecto (compilar, desplegar, etc), así como los módulos de los que puede constar un proyecto.
El contenido el fichero pom.xml debería ser similar al siguiente:
<?xml version="1.0" encoding="UTF-8"?>
<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>com.devsmobile.pruebarest</groupId>
<artifactId>prueba-rest</artifactId>
<version>1.0-SNAPSHOT</version>
<packaging>war</packaging>
<name>Simple CXF JAX-RS webapp service using spring configuration</name>
<description>Simple CXF JAX-RS webapp service using spring configuration</description>
<properties>
<jackson.version>1.8.6</jackson.version>
</properties>
<dependencies>
<dependency>
<groupId>org.apache.cxf</groupId>
<artifactId>cxf-rt-frontend-jaxrs</artifactId>
<version>3.0.3</version>
</dependency>
<dependency>
<groupId>org.apache.cxf</groupId>
<artifactId>cxf-rt-rs-client</artifactId>
<version>3.0.3</version>
</dependency>
<dependency>
<groupId>org.codehaus.jackson</groupId>
<artifactId>jackson-core-asl</artifactId>
<version>${jackson.version}</version>
</dependency>
<dependency>
<groupId>org.codehaus.jackson</groupId>
<artifactId>jackson-mapper-asl</artifactId>
<version>${jackson.version}</version>
</dependency>
<dependency>
<groupId>org.codehaus.jackson</groupId>
<artifactId>jackson-jaxrs</artifactId>
<version>${jackson.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-web</artifactId>
<version>3.2.6.RELEASE</version>
</dependency>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.11</version>
<scope>test</scope>
</dependency>
</dependencies>
<build>
<pluginManagement>
<plugins>
<plugin>
<groupId>org.apache.tomcat.maven</groupId>
<artifactId>tomcat7-maven-plugin</artifactId>
<version>2.0</version>
<executions>
<execution>
<id>default-cli</id>
<goals>
<goal>run</goal>
</goals>
<configuration>
<port>13000</port>
<path>/jaxrs-service</path>
<useSeparateTomcatClassLoader>true</useSeparateTomcatClassLoader>
</configuration>
</execution>
</executions>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<configuration>
<source>1.6</source>
<target>1.6</target>
</configuration>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-eclipse-plugin</artifactId>
<configuration>
<projectNameTemplate>[artifactId]-[version]</projectNameTemplate>
<wtpmanifest>true</wtpmanifest>
<wtpapplicationxml>true</wtpapplicationxml>
<wtpversion>2.0</wtpversion>
</configuration>
</plugin>
</plugins>
</pluginManagement>
<plugins>
<plugin>
<groupId>org.codehaus.mojo</groupId>
<artifactId>build-helper-maven-plugin</artifactId>
<version>1.5</version>
<executions>
<execution>
<id>reserve-network-port</id>
<goals>
<goal>reserve-network-port</goal>
</goals>
<phase>process-test-resources</phase>
<configuration>
<portNames>
<portName>test.server.port</portName>
</portNames>
</configuration>
</execution>
</executions>
</plugin>
<plugin>
<groupId>org.apache.tomcat.maven</groupId>
<artifactId>tomcat7-maven-plugin</artifactId>
<executions>
<execution>
<id>start-tomcat</id>
<goals>
<goal>run-war</goal>
</goals>
<phase>pre-integration-test</phase>
<configuration>
<port>${test.server.port}</port>
<path>/jaxrs-service</path>
<fork>true</fork>
<useSeparateTomcatClassLoader>true</useSeparateTomcatClassLoader>
</configuration>
</execution>
<execution>
<id>stop-tomcat</id>
<goals>
<goal>shutdown</goal>
</goals>
<phase>post-integration-test</phase>
<configuration>
<path>/jaxrs-service</path>
</configuration>
</execution>
</executions>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-failsafe-plugin</artifactId>
<version>2.8.1</version>
<executions>
<execution>
<id>integration-test</id>
<goals>
<goal>integration-test</goal>
</goals>
<configuration>
<systemPropertyVariables>
<service.url>http://localhost:${test.server.port}/jaxrs-service</service.url>
</systemPropertyVariables>
</configuration>
</execution>
<execution>
<id>verify</id>
<goals>
<goal>verify</goal>
</goals>
</execution>
</executions>
</plugin>
</plugins>
</build>
</project>
A continuación iremos viendo por partes las zonas más importantes del fichero.
- Cabecera: Debemos indicar la versión de pom.xml que vamos a emplear (en Maven 2 y en Maven 3, el estándar y soportado es 4.0.0, que encontraremos en todos los proyectos). Además todos los módulos Maven, deben tener nombre de grupo (paquete), nombre de artefacto, versión, nombre (más descriptivo que el artifactId que suele tener nomenclatura corta), una descripción del módulo y su forma de empaquetado
(en este caso un war, si por ejemplo fuera una librería, sería un jar como ya explicaremos):
<modelVersion>4.0.0</modelVersion> <groupId>com.devsmobile.pruebarest</groupId> <artifactId>prueba-rest</artifactId> <version>1.0-SNAPSHOT</version> <packaging>war</packaging> <name>Simple CXF JAX-RS webapp service using spring configuration</name> <description>Simple CXF JAX-RS webapp service using spring configuration</description>
- Propiedades: permite definir constantes a nivel de pom. Es muy común mantener una constante (como en este ejemplo), para gestionar conjuntamente las versiones de las librerías. Van dentro del tag <properties>:
<properties> <jackson.version>1.8.6</jackson.version> </properties>
- Dependencias: define las dependencias del proyecto para ser construido. Estas dependencias son externas y se descargarán por defecto del repositorio central (aunque es posible añadir otros repositorios externos). Van dentro del tag <dependencies>:
<dependencies>
<dependency>
<groupId>org.apache.cxf</groupId>
<artifactId>cxf-rt-frontend-jaxrs</artifactId>
<version>3.0.3</version>
</dependency>
<dependency>
<groupId>org.apache.cxf</groupId>
<artifactId>cxf-rt-rs-client</artifactId>
<version>3.0.3</version>
</dependency>
<dependency>
<groupId>org.codehaus.jackson</groupId>
<artifactId>jackson-core-asl</artifactId>
<version>${jackson.version}</version>
</dependency>
<dependency>
<groupId>org.codehaus.jackson</groupId>
<artifactId>jackson-mapper-asl</artifactId>
<version>${jackson.version}</version>
</dependency>
<dependency>
<groupId>org.codehaus.jackson</groupId>
<artifactId>jackson-jaxrs</artifactId>
<version>${jackson.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-web</artifactId>
<version>3.2.6.RELEASE</version>
</dependency>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.11</version>
<scope>test</scope>
</dependency>
</dependencies>
Como podemos comprobar, se está haciendo uso de la propiedad jackson.version que estaba definida en la zona de propiedades. (En este ejemplo el archetype ha dejado el resto de dependencias con su versión en línea, pero suele ser recomendable para verlas en un simple vistazo, haber añadido todas a la sección de propiedades).
Caso práctico: Imaginemos que queremos añadir la librería Simple XML que permite parsear y generar XML de manera sencilla.
Si entramos a su web podemos ver que en el apartado de Maven ya se explica rápidamente la dependencia que hay que añadir a la sección de dependencias si queremos añadir la librería:
(Lo suyo es que sacarmos una propiedad como simplexml.version y sustituir el 2.7.1 de la siguiente manera):
<properties>
<jackson.version>1.8.6</jackson.version>
<simplexml.version>2.1.7</simplexml.version>
</properties>
<dependencies>
...
<dependency>
<groupId>org.simpleframework</groupId>
<artifactId>simple-xml</artifactId>
<version>${simplexml.version}</version>
</dependency>
</dependencies>
Si por el motivo que fuera no encontráramos en la web su modo de empleo por Maven, podríamos tratar de encontrar el artefacto a través de una búsqueda en el repositorio central de Maven:
Una vez añadida la dependencia, si le indicamos a Maven que genere el war, veremos cómo se descarga el pom.xml y el jar correspondiente a la librería añadida y podremos encontrarla en la carpeta repository de Maven:
mvn clean package
Explicaremos la siguiente entrada, el resto de secciones y cómo compilar/generar paquetes desde Maven (aunque ya hayamos visto alguna noción en la entrada de hoy).



Hmm is anyone else experiencing problems with the images on this blog loading? I'm trying to find out if its a problem on my end or if it's the blog. Any feedback would be greatly appreciated. yahoo sign in
ResponderEliminar