miércoles, 15 de diciembre de 2010

Introducción a Maven 2.2.1 con Netbeans.

Introducción

Existen una amplia variedad de cosas que se pueden hacer con Maven; sin embargo su principal función es la de ser un administrador de dependencias y versiones para proyectos hechos en Java. Es decir, si en alguna ocasión te has visto en la necesidad de lidiar con proyectos relativamente grandes como lo pueden ser las aplicaciones web, te habrás dado cuenta que mientras más frameworks, jars, utilerías y demás paquetes java se utilizan para un desarrollo, el nivel de complejidad entre las dependencias crece exponencialmente hasta llegar al punto que administrar estas dependencias puede llegar a ser un verdadero problema. Más aún, si el desarrollo de una aplicación se lleva a cabo por un equipo de dos o más personas, el problema puede llegar a ser demasiado grande para ser manejado descentemente sin la ayuda de herramientas como Maven.

Apache Maven (o Maven a secas) es una de esas poderosas herramientas que cuando las ves por primera vez parecen no tener mucho sentido y esto es porque la forma en la que se configura (esto es por medio de archivos xml) la tarea de modificar, leer o introducir nuevos componentes a la configuración de Maven puede llegar a ser tortuosa, e incluso aburrida; pero no te desanimes, detrás de todo ese código xml existe una gran herramienta que con un poco de práctica se puede convertir en una buena aliada.

A pesar que existen GUI para manejar propiamente el xml requerido por Maven (por ejemplo la integrada con Eclipse o con Netbeans) la mayoría de las veces los códigos de configuración referentes a Maven que se encuentra en Internet, en su mayoría vienen en xml plano, por lo que por el momento nos evitaremos el uso de una interfaz gráfica para el manejo del archivo de configuración de Maven.

Las tareas que se pueden realizar con Maven pueden ser muy variadas: desde hacer un deploy automático en un servidor Weblogic hasta aplicar métricas a tu código, realizar estadísticas y entregar un reporte en un documento html configurado con una plantilla específicamente diseñada para tu propia empresa; todo esto por medio de plugins y más y más configuraciones de xml.

Pero antes de poder configurar a Maven para que haga todas estas cosas necesitamos hacer un pequeño proyecto de prueba para probar esta herramienta, así que entremos en materia.

Ejemplo básico

Precondición:
  • Estamos suponiendo que en este punto ya se tiene instalado el Netbeans versión 6.5 o mayor configurado con Maven.
  • Si es la primera vez que ejecutas Maven en tu computadora necesitarás tener conexión a internet ya que la primera vez que se Maven se ejecuta descarga algunos MB's de información para poder ejecutarse.
El primer paso es abrir tu Netbeans y dar click en File > New Proyect y dentro de la pantalla que aparece seleccionamos la carpeta de Maven y del lado derecho seleccionamos Maven Proyect.


En la siguiente pantalla dejamos la opción Maven Quickstart Archetype (1.0). Damos click en Next.

El siguiente paso es importante ya que debemos introducir información que identificará al nuevo proyecto que estamos construyendo. En la pantalla que aparece introducimos la siguiente información:
  • Project Name: test.maven
Aquí le decimos a NB cómo se llamará la carpeta de nuestro proyecto dentro del sistema de archivos de nuestra computadora.

  • Project Location: C:\Documents and Settings\sawbona\Mis documentos\NetBeansProjects
La carpeta dentro del sistema de archivos donde se guardará la carpeta que creamos en el punto anterior.

  • Project Folder: "NB automáticamente llena esta parte y lo hace uniendo los dos campos anteriores. Será la ruta final completa donde estará localizado nuestro proyecto"

En este punto es donde debemos de detenernos un poco para explicar cómo funciona Maven.

La forma en que Maven identifica un proyecto de manera única es mediante la unión de tres etiquetas lógicas "especiales" o cómo algunas personas he escuchado que lo llaman: meta-información. Esta información es la siguiente:

  • Nombre de la compañía que desarrolla el proyecto; o como Maven le llama "groupId"
  • Nombre del proyecto que se está desarrollando; mejor conocido como "artifactId" y finalmente...
  • Versión del proyecto; o "version" (sin asento) para Maven.
Estos son los tres trozos de información que Maven utiliza para identificar todas y cada una de las dependencias, cualquier proyecto o plugin que utilize y es en este punto donde NB nos pide que bauticemos a nuestro nuevo proyecto así que procedemos a darle un nombre.

  • Artifact Id: test.maven

En la versión de NB 6.5 y mayores este campo es tomado automáticamente del nombre que introdujimos como "Project Name", posteriormente este nombre lo podemos cambiar en el archivo de configuración de Maven; sin embargo recomiendo mantener el mismo nombre del Artifact Id con el nombre de la carpeta donde estamos guardando el proyecto, sobre todo porque cuando navegemos en el sistema de archivos vamos a poder reconocer más fácilmente qué carpeta contiene qué proyecto.

  • Group Id: sawbona.code
Aquí podrías poner el nombre del dominio de tu empresa, tu nombre o la escuela donde estudias. Este es un punto importante ya que cuando quieres agregar dependencias de otros grupos o empresar es fácil buscar en internet por el GroupId de la empresa que quieras. Para nuestro caso si alguien quisiera buscar código que nuestra empresa, grupo o nosotros mismos desarrollásemos, sería más fácil que identificaran nuestros productos por un groupId consistente y fácilmente identificable. Normalmente corresponde al dominio en internet.

  • Version: 1.0-SNAPSHOT
En el contexto de Maven, se utiliza la palabra SNAPSHOT para hablar de versiones en desarrollo y pues eso, bautizamos a nuestra aplicación de prueba como la primera versión de desarrollo.

La pantalla resultante de NB debe verse como la siguiente imagen:


Una vez introducida la esta información, damos click en el botón "Finish" tras lo cual NB creará en un directorio en nuestra computadora que contendrá dos clases y mirando dentro del explorador del NB podremos ver que el proyecto tiene la siguiente estructura.


Si nos fijamos en nuestro disco duro, NB ha creado una carpeta con la siguiente estructura:
La filosofía de la organización de Maven radica en que los proyectos hechos en Java siguen una estructura estándar dependiendo de su naturaleza (aplicación de escritorio, EJB, WAR, etc...). Es decir en nuestro caso le hemos dicho a NB que íbamos a crear un proyecto simple en Java con una clase principal que contiene un método main como punto de entrada, por lo que Maven (por medio de NB como intermediario) ha creado la carpeta de nuestro proyecto que contiene un archivo pom.xml y una carpeta src y una estructura predefinida.

Dentro de la carpeta src tenemos dos carpetas, una llamada main, que es donde colocaremos el código "funcional" de nuestra aplicación y una carpeta test que es donde deberíamos, por default, colocar el código de nuestras pruebas unitarias.

Para continuar con la prueba de nuestra aplicación volvemos a nuestro NB, abrimos el explorador de proyectos y navegamos hasta la clase App.java y la abrimos. Damos click con el botón derecho del mouse y seleccionamos "Run File".


Si es la primera vez que ejecutas Maven verás que en la salida de consola de NB (Control + 4) empiezan a aparecer líneas de texto informando que Maven está descargando información (o más formalmente "dependencias") de Internet, este proceso, dependiendo de tu  velocidad de conexión tardará de dos a diez minutos, por lo que deberás ser paciente.

Una vez que Maven ha descargado todas las dependencias necesarias para ejecutarse veras que en la salida de NB aparece la línea Hello World de nuestro proyecto de prueba.

Ya para finalizar...

Hasta este punto hemos creado, compilado e instalado una aplicación con un groupId=sawbona.code, artifactid=maven.test y version=1.0-SNAPSHOT. Para ver dónde es que vivirá nuestra aplicación abrimos nuestro sistema de archivos y en el caso de Windows abrimos la siguiente ruta:

C:\Documents and Settings\sawbona\.m2\repository\sawbona\code\test.maven\1.0-SNAPSHOT

Dentro de esta carpeta debe existir un jar llamado test.maven-1.0-SNAPSHOT.jar que corresponderá a nuestra aplicación ya empaquetada y lista para ser usada. Si nos fijamos en el nombre de este jar vemos que está conformado por el artifactId y por la versión que introdujimos en un principio. De la misma forma si nos fijamos en la ruta que estamos navegando vemos que está conformada por el groupId, donde cada punto lo trasforma a una nueva carpeta dentro del sistema de archivos, seguida por una carpeta que corresponde al artifactId y finalmente la versión de nuestro proyecto.

La otra mitad de la ruta (C:\Documents and Settings\sawbona\.m2\repository) que estamos navegando corresponde a lo que Maven llama nuestro "repositorio local" de dependencias. Cuando Maven necesita un jar para compilar un proyecto el primer lugar que analiza es su repositorio local en busca de los jars (también llamados dependencias) necesarios para compilar el proyecto en turno, estos jars (dependencias) nosotros los declaramos dentro del archivo de configuración de nuestro proyeto al cual Maven lo llama pom.xml. Por default maven primero busca en nuestro repositorio local y después va buscando en orden en diferentes repositorios ubicados en internet.

Si abrimos NB y miramos dentro de la carpeta Project Files de nuestro proyecto de prueba veremos un archivo llamado pom.xml y si miramos el contenido veremos una sección que reza así:


<modelVersion>4.0.0</modelVersion>
  <groupId>sawbona.code</groupId>
  <artifactId>test.maven</artifactId>
  <packaging>jar</packaging>
  <version>1.0-SNAPSHOT</version>
  <name>test.maven</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>



Cuando le dijimos a NB que creara nuestro proyecto, Maven agregó por default una dependencia a junit versión 3.8.1. Si buscamos dentro de nuestro repositorio local veremos que existe la siguiente ruta:

C:\Documents and Settings\sawbona\.m2\repository\junit\junit\3.8.1

Que es la ruta donde Maven ha descargado el jar de junit que incluirá como dependencia de nuestro proyecto y el cual aparece dentro de la carpeta de "Test Libraries" dentro del navegador de proyectos de NB.

También viendo el archivo pom.xml podemos ver que la información que introdujimos en el momento de la creación del proyecto con NB está plasmada en este archivo.

Así llegamos al punto final de esta entrada: el archivo pom.xml.

Este es el archivo principal de configuración de los proyectos hecho en y para Maven. En este archivo podemos configurar todo sobre maven: plugins, dependencias, reporteadores y una larga lista de etc. Estas modificaciones puedes ser hechas mediante un editor de texto plano como el NotePad++ o con una GUI destinada para estos propósitos. Cuando le decimos a NB que nos cree un proyecto hecho en Maven básicamente NB funciona como in termediario que manda a ejecutar unas tareas específicas de Maven (llamados plugins) para que cree un esqueleto básico (también llamado archetype) y es este el que crea la estructura básica del proyecto junto con el archivo pom.xml que hemos analizado.

Y eso es todo. Esta es mi pequeña introducción a apache Maven con Netbeans que espero que a alguna persona le sea útil.

Saludos.

    3 comentarios: