viernes, febrero 12, 2016

Notas sobre Maven(I)

Maven es un sistema de gestión de proyectos de software que nació con el objetivo de simplificar la construcción del proyecto Apache Turbine. A partir de ahí evoluciona hacia un sistema que permite la gestión de proyectos de software de manera estándar: construcción de entregables, gestión de pruebas y publicación de los mismos. Podría verse como un sistema de construcción como las autotools, cmake o ant al que se le añade una serie de mecanismos que permiten la construcción de proyectos Java de manera sencilla, uniforme, siguiendo las guías de buenas prácticas. Maven es lo bastante flexible para extender su funcionalidad a través de un sistema de plugins.

Para instalar Maven necesitamos tener el correspondiente Java JDK en el sistema. Nos bajamos la la versión compilada de Maven, descomprimirla en un directorio y modificar el PATH de nuestro sistema para que encuentre los binarios:

$ mkdir -p /usr/local/java
$ cd /usr/local/java
$ wget http://ftp.cixug.es/apache/maven/maven-3/3.3.9/binaries/apache-maven-3.3.9-bin.tar.gz
$ # Siempre conviene verificar la correcta huella digital
$ wget http://www.apache.org/dist/maven/maven-3/3.3.9/binaries/apache-maven-3.3.9-bin.tar.gz.asc
$ gpg --verify apache-maven-3.3.9-bin.tar.gz.asc
$ tar zxvf apache-maven-3.3.9-bin.tar.gz
$ ln -s apache-maven-3.3.9 maven
$ # Borrar los ficheros bajados
$ rm apache-maven-3.3.9-bin.tar.gz
$ rm apache-maven-3.3.9-bin.tar.gz.asc
$ # Añadir al PATH la ruta /usr/local/java/maven/bin

Si se ha instalado correctamente, podremos ejecutar mavem:

$mvn --version
Apache Maven 3.3.3 (NON-CANONICAL_2015-09-23T11:40:22_root; 2015-09-23T11:40:22+02:00)
Maven home: /usr/local/java/maven
Java version: 1.8.0_65, vendor: Oracle Corporation
Java home: /Library/Java/JavaVirtualMachines/jdk1.8.0_65.jdk/Contents/Home/jre
Default locale: es_ES, platform encoding: UTF-8
OS name: "mac os x", version: "10.11.3", arch: "x86_64", family: "mac"

Los proyectos en Maven se definen en un fichero XML , pom.xml. Este fichero es la unidad básica que utiliza Maven para definir un proyecto. Como puede leer en la introducción al pom, toda instalación de Maven tiene un pom por defecto, del cual heredan el resto de los poms que se definan a menos que nosotros lo cambiemos específicamente alguna de las propiedades de ese pom.xml raíz.

La manera más sencilla de empezar a utilizar Maven es a través de un ejemplo: Un sencillo programa que quede encapsulado en un JAR y que se pueda ejecutar fácilmente con java -jar package.jar. Puesto que Maven nos fuerza a tener cierta estructura en nuestros proyecto, lo primero que vamos a tener que definir es la la misma para nuestro paquete y el nombre de nuestro proyecto. Por ejemplo, voy a usar org.ctb.maven como el identificador de grupo y el ListIfaces como identificador de artfacto. Con esta idea, usamos la opción que tiene Maven de generar nuestra estructura de proyecto:

$ mvn archetype:generate -DgroupId=org.ctb.maven -DartifactId=ListIfaces -DarchetypeArtifactId=maven-archetype-quickstart -DinteractiveMode=false

Lo primero que hará Maven será bajarse aquellos artefactos (jars) que necesite para construir nuestro programa, creará el fichero pom.xml y la estructura de directorios que las guías de buenas prácticas aconsejan. Se podrá compilar la aplicación simplemente con:

cd ListIfaces
mvn install

De nuevo, veremos a Maven bajándose los diferentes plugins que necesita, y en el directorio target nos generará el fichero jar con nuestra clase compilada. Decir que todos estos elementos quedan cacheados en nuestro sistema para su posterior utilización. En el caso de MacOS X esta en el $HOME/.m2

El fichero pom.xml que nos ha generado automáticamente Maven 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>org.ctb.maven</groupId>
  <artifactId>ListIfaces</artifactId>
  <packaging>jar</packaging>
  <version>1.0-SNAPSHOT</version>
  <name>ListIfaces</name>
  <url>http://maven.apache.org</url>
  <dependencies>
    <dependency>
      <groupId>junit</groupId>
      <artifactId>junit</artifactId>
      <version>3.8.1</version>
      <scope>test</scope>
    </dependency>
  </dependencies>
</project>

En este simple pom.xml nos pone sobre la pista de varios parámetros que debemos de tener en cuenta a la hora de realizar nuestro proyecto y que nos fuerza las convenciones de Maven

groupId
Este parámetro identifica a nuestro proyecto de manera única entre todos los proyectos. Lo ideal es que aprovechemos la estructura de nuestros propios paquetes para seleccionar el groupId correcto.
artifactId
Nos da el nombre del JAR (u otro entregable) sin la versión
version
La versión de nuestro entregable

No hay comentarios: