Introducción

Al desarrollar en java siempre tenemos varias tareas que realizar. Entre las primeras es crear una estructura de directorio para nuestras fuentes y el descargar librerías con las dependencia que utilizaremos en nuestro proyecto.

También tendremos la tarea de compilar nuestro proyecto y asignarle un lugar donde ubicar nuestro archivos compilados (jar, war, etc.).

Para las tareas antes mencionamos y otras que necesitamos al desarrollar proyectos en Java, tenemos la herramienta Apache Maven.

¿Que es Apache Maven?

Es una herramienta libre (Software Libre)  que ayuda a simplificar la  construcción y administración de proyectos basados en Java. Cuenta con un modelo de configuración de construcción simple, basado en un formato xml.

Maven puede administrar la construcción, los informes y la documentación de un proyecto a partir de una información central.

Aunque fue desarrollado para implementarse en una interfaz de comando, es posible su integración con algunos IDE mediante plugin. ¿Quieres saber más?

Entres sus principales características tenemos:

  • Inicializa la contribución de proyectos sin pre-configuraciones.
  • Gestión de dependencias.
  • Puede trabajar con múltiples proyectos

Conceptos utilizados en Maven.

Antes de ponernos en marcha en nuestro proyecto hola mundo (hw). Veremos algunos conceptos que nos ayudarán a comprender cómo trabaja Maven.

Grupos,artefactos y versión.

Artefacto (artifactId): es un identificador de proyecto, que en su momento podrá ser una dependencia que podemos incluir en un proyecto. Cada artefacto puede tener dependencias entre sí, por lo tanto, si incluimos un artefacto en un proyecto, Maven nos proporciona sus dependencias.

Grupo (group): es un identificador de un conjunto de artefactos. Este identificador se recomienda que se escriba un nombre de dominio inverso, por ejemplo si tenemos un dominio midominio.org el nombre sería org.midominio.

Versión (versión): Identifica la versión del artefacto generado por el proyecto, ya que un artefacto puede tener varias versiones. Maven agrega SNAPSHOT en una versión, lo que indica que un proyecto está en un estado de desarrollo.

Arquetipo

Arquetipo(archetype): Podemos decir que son plantillas parametrizadas que se utilizan como base para escribir y organizar el código de un proyecto, teniendo las siguientes ventajas:

  • Homogeneidad entre distintos desarrollos que utilizan las mismas tecnologías.
  • Reutilización y construcción de unos arquetipos como suma de otros.
  • Estandarización de los proyectos dentro de una organización. La homogeneidad en la estructura del proyecto facilita las tareas de desarrollar, desplegar y mantener el proyecto generado.
  • Reducción del tiempo necesario para la construcción de los diversos servicios.

En la página oficial podemos encontrar información de los Arquetipo estándar de Apache Maven.

Ciclo de vida

El ciclo de vida son las fases que lleva construir y distribuir un artefacto en Maven. Las partes de un ciclo de vida principal son:

  1. compile: Genera los ficheros .class compilando los fuentes .java
  2. test: Ejecuta los test automáticos de JUnit existentes, abortando el proceso si alguno de ellos falla.
  3. package: Genera el fichero .jar con los .class compilados
  4. install: Copia el fichero .jar a un directorio de nuestro ordenador donde maven deja todos los .jar. De esta forma esos .jar pueden utilizarse en otros proyectos maven en el mismo ordenador.
  5. deploy: Copia el fichero .jar a un servidor remoto, poniéndolo disponible para cualquier proyecto maven con acceso a ese servidor remoto.

Cada ciclo de vida consta con una lista de fases de construcción, en la que una fase es una secuencia ordenada de fases, que representa una etapa del ciclo de vida. En la documentación oficial podremos ver una lista de las fases de cada ciclo de vida

Instalación.

Como toda aplicación desarrollada en Java, puede ejecutarse en cualquier máquina virtual (JVM), sin importar la arquitectura de la computadora subyacente. por lo que es necesario tener instalado un JDK.

En Sistemas GNU/Linux.

Para instalar Maven en sistema GNU/Linux basta con instalar con el gestor de paquete de la distribución GNU/Linux de tu preferencia. En este ejemplo utilizaré el gestor de paquete de la distribución Debian.

Como súper usuario digitamos las siguientes sentencias:

apt update
apt upgrade
apt install maven.

En Sistema Windows

Pre-instalación.

En sistema Windows tenemos que tener instalado JDK previamente de la instalación de Maven. Nos aseguramos que esté instalado JDK con la siguiente sentencia en la ventana de comandos:

java -version

En el caso de no tener instalado JDK procedemos a instalarlo. En este caso instalaremos la versión open source.

Ver tutorial Instalar java (OpenJDK) en Windows

Instalación.

Teniendo instalado JDK procederemos a descargar Maven de la página oficial.

https://maven.apache.org/download.cgi

Descargamos el archivo zip y lo descomprimimos en la ubicación de nuestra preferencia.

Hasta aquí ya tenemos instalado Maven para ejecutarlo en la carpeta que se descomprimió. Para ejecutar Maven fuera de la carpeta que se instaló, tendremos que agregar unas variables de entorno al sistema, el cual lo haremos con las siguientes sentencia desde la ventana de comando.

set M2_HOME=c:\Program Files\maven
set PATH=%PATH%;%M2_HOME%\bin

Ya tenemos instalado Maven listo para ponerlo a trabajar.

Puesta en marcha.

Verificación de instalación

Una vez instalado Maven procedemos a verificar que está correctamente instalado. Desde la ventana de comando procedemos a digitar la siguiente sentencia.

mvn -version

Generar proyecto Hola Mundo

Procederemos a crear nuestro primer proyecto el cual sera el clásico Hola Mundo, desde la terminal digitalizaremos las siguiente sentencia.

mvn archetype:generate  -DgroupId=ni.jug -DartifactId=hw -DarchetypeArtifactId=maven-archetype-quickstart -DinteractiveMode=false

Pero, qué hace todo eso o qué significa todo eso? Bueno, vamos explicar punto por punto la sentencia que acabamos de digitar.

mvn : es el comando utilizado para llamar a Maven.

archetype:generate :esto indica que quieres generar un nuevo proyecto.

DgroupId=ni.jug: Le indica cual será el identificador del grupo de proyectos de los desarrolladores. En este caso el grupo lo estamos identificando con ni.jug

DartifactId=hw : Esto le indica cual será el identificador del proyecto que se está construyendo, en este caso estamos identificándolo con hw de hello word.

DarchetypeArtifactId=maven-archetype-quickstart : Esta opción le indica cual será el archetype con que se inicializará el proyecto, creando el árbol de directorio especificado en el archetype maven-archetype-quickstart. El archetype el cual podremos documentarnos en la pagina oficial de Maven

DinteractiveMode=false : con este parámetro le decimos a maven que utilice configuraciones predeterminadas para generar el proyecto y no pedir confirmaciones.

Analicemos el resultado

Directorios

Finalizado el generador con el DarchetypeArtifactId=maven-archetype-quickstart, ya tenemos inicializado nuestro proyecto Hola Mundo y hemos obteniendo el siguiente árbol de directorio.

. 
├── pom.xml 
└── src 
   ├── main 
   │   └── java 
   │       └── ni 
   │           └── jug 
   │               └── App.java 
   └── test 
       └── java 
           └── ni 
               └── jug 
                   └── AppTest.java 

Como se puede observar en el directorio del proyecto existe un directorio principal src, en este directorio se almacenan todos los recursos del proyecto, en el directorio src/main/java se almacenaran las fuentes del proyecto y el directorio src/test/java se almacena las fuentes de prueba del proyecto.
Maven cuenta con una estructura de directorio común que ayuda a los desarrolladores a familiarizarse con otros proyectos maven y un mismo proyecto en diferentes Ides. Puede ver la estructura de los directorios en la documentación oficial.

Archivo POM

Como podemos ver en árbol de directorios también tenemos un archivo llamado pom.xml (Project Object Model por su siglas en ingles), este archivo es un xml el cual es utilizado por maven entre otras cosas, para especificar configuración de dependencias del proyecto, los parámetros de compilación, los perfiles de compilación, etc.

Al utilizar el arquetipo maven-archetype-quickstart,obtenemos en el archivo pom.xml, con el siguiente contenido :

<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>ni.jug</groupId>
      <artifactId>hw</artifactId>
      <packaging>jar</packaging>
      <version>1.0-SNAPSHOT</version>
      <name>hw</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>

Analicemos el archivo pom.xml

Para explicar el contenido de este archivo pom.xml lo dividiremos en dos partes, donde la primera parte corresponde a la información del proyecto.

Información del Proyecto
<modelVersion>4.0.0</modelVersion>
<groupId>ni.jug</groupId>
<artifactId>hw</artifactId>
<packaging>jar</packaging>
<version>1.0-SNAPSHOT</version>
<name>hw</name>
<url>http://maven.apache.org</url>

De estos son obligatorios especificar los valores de las etiquetas<groupId></groupId> y  <artifactId></artifactId> ,  <version></version>, <packaging></packaging>  que como pueden ver con el maven-archetype-quickstart son escrita en el pom.xml al momento generar la construcción del proyecto. De las etiquetas groupId, artifactId y versión ya hemos comentado algo anteriormente, por lo que hablaremos un poco de la etiqueta packaging.<packaging></packaging> En esta etiqueta especificamos como sera empaquetado el proyecto teniendo la opción de hacer un archivo jar , war, ear,pom.¿Quieres saber mas?

Dependencias

En la segunda parte de este archivo pom.xml tenemos las dependencias

<dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>3.8.1</version>
<scope>test</scope>
</dependency>
</dependencies>

Entre las etiquetas <dependencies> </dependencies> le indicamos a maven todas las dependencias que tendrá el proyecto, de esta etiqueta solo podremos indicar una etiqueta en todo el proyecto. Donde la etiqueta <dependencies> nos indica donde se inicia la declaración de dependencia y la </dependencies> nos indica donde finaliza la declaración de dependencias

<dependency></dependency> en esta etiqueta le decimos a maven el identificador del grupo<groupId>, el identificador <artifactId> y la versión<version> de la librería que tendrá dependencia el proyecto. También encontramos la etiqueta <scope> de la cual hablaremos un poco.
La etiqueta scope sirve para indicar el alcance de nuestra dependencia y También ayuda a determinar qué artefactos incluir en una distribución de este proyecto.

  • compile: es la que tenemos por defecto sino especificamos scope. Indica que la dependencia es necesaria para compilar. La dependencia además se propaga en los proyectos dependientes.
  • provided: Es como la anterior, pero esperas que el contenedor ya tenga esa libreria. Un claro ejemplo es cuando desplegamos en un servidor de aplicaciones, que por defecto, tiene bastantes librerías que utilizaremos en el proyecto, así que no necesitamos desplegar la dependencia.
  • runtime: La dependencia es necesaria en tiempo de ejecución pero no es necesaria para compilar.
  • test: La dependencia es solo para testing que es una de las fases de compilación con maven. JUnit es un claro ejemplo de esto.
  • system: Es como provided pero tienes que incluir la dependencia explícitamente. Maven no buscará este artefacto en tu repositorio local. Habrá que especificar la ruta de la dependencia mediante la etiqueta <systemPath>
  • import: este solo se usa en la sección dependencyManagement.

Compilación y ejecución del proyecto.

Maven toma la versión de java 1.5 como predeterminado, para las versiones de maven superior a la 3.6 es necesario especificar la versión de java 1.7 o superior por lo que tendremos que agregar la siguiente propiedad al pom.xml

<properties> 
    <maven.compiler.source>11</maven.compiler.source>
    <maven.compiler.target>11</maven.compiler.target>
</properties>

Modificando el pom.xml

Para este ejemplo tomamos la versión 11 de java y nos quedara el pom.xml de la siguiente manera:

<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>ni.jug></groupId>
    <artifactId>hw</artifactId>
    <packaging>jar</packaging>
    <version>1.0-SNAPSHOT</version>
    <name>hw</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>
   <properties>
     <maven.compiler.source>11</maven.compiler.source>
     <maven.compiler.target>11</maven.compiler.target>
   </properties>
</project>

Finalizado el cambio al pom.xml ,procedemos a empaquetar el proyecto con la siguiente sentencia:

mvn package

Al finalizar la compilación, y  el proyecto este empaquetar, nos agregara el directorio target donde encontraremos el archivo jar el cual podremos ejecutar con la siguiente sentencia:

java -cp target/hw-1.0-SNAPSHOT.jar ni.jug.App

y el resultado de ejecutar nuestro proyecto hw.

 

Hello World!

 

Listo hasta aquí hemos finalizado nuestros primeros pasos con Maven. Si deseas ver en detalle como generar una aplicación web con Maven, puedes ir a este enlace.

Nosotros y terceros seleccionados utilizamos cookies o tecnologías similares con fines técnicos y, con su consentimiento, para otras finalidades (“interacciones y funcionalidades básicas”, “mejora de la experiencia”, “medición” y “segmentación y publicidad”) según se especifica en la política de cookies. Usted es libre de otorgar, denegar o revocar su consentimiento en cualquier momento.    Configurar y más información
Privacidad