Apache Maven es una potente herramienta de gestión de proyectos que se utiliza para gestión de dependencias, como herramienta de compilación e incluso como herramienta de documentación. Es de código abierto y gratuita.
Aunque se puede utilizar con diversos lenguajes (C#, Ruby, Scala...) se usa principalmente en proyectos Java, donde es muy común ya que está escrita en este lenguaje. De hecho, frameworks Java como Spring y Spring Boot la utilizan por defecto, por lo que conviene conocerla si trabajas en la plataforma Java y, desde luego, con Spring.
Al contrario que otras herramientas anteriores y más limitadas como Apache Ant (también muy popular), Maven utiliza convenciones sobre dónde colocar ciertos archivos para el proceso de build de un proyecto, por lo que solo debemos establecer las excepciones y por lo tanto simplifica mucho el trabajo. Además, es una herramienta declarativa. Es decir, todo lo que definamos (dependencias en módulos y compontes externos, procesos, orden de compilación, plugins del propio Maven...) se almacena en un archivo XML que Maven lee a la hora de funcionar. Otras alternativas, como Gradle no utilizan archivos XML, sino de otro tipo, pero usan los mismos conceptos de Maven.
Con Maven se puede:
- Gestionar las dependencias del proyecto, para descargar e instalar módulos, paquetes y herramientas que sean necesarios para el mismo.
- Compilar el código fuente de la aplicación de manera automática.
- Empaquetar el código en archivos .jar o .zip.
- Instalar los paquetes en un repositorio (local, remoto o en el central de la empresa)
- Generar documentación a partir del código fuente.
- Gestionar las distintas fases del ciclo de vida de las build: validación, generación de código fuente, procesamiento, generación de recursos, compilación, ejecución de test ...
Además, la mayor parte de los entornos de desarrollo y editores de Java disponen de plugins específicos o soporte directo de Maven para facilitarnos el trabajo con esta, puesto que se ha convertido en una herramienta casi universal.
¿Qué es el archivo pom.xml?
La unidad básica de trabajo en Maven es el llamado Modelo de Objetos de Proyecto conocido simplemente como POM (de sus siglas en inglés: Project Object Model).
Se trata de un archivo XML llamado pom.xml
que se encuentra por defecto en la raíz de los proyectos y que contiene toda la información del proyecto: su configuración, sus dependencias, etc...
El hecho de utilizar un archivo XML revela su edad. Maven se creó en 2002, cuando XML era lo más. Si se hubiese creado unos pocos años después seguramente tendríamos un pom.json
y si hubiese sido más reciente un pom.yml
. Modas que vienen y van. No obstante, el formato XML, aunque engorroso, es muy útil a la hora de definir con mucho detalle cómo debe ser cada propiedad y, también, para poder comprobarlas.
Incluso, aunque nuestro proyecto, que usa Maven, tenga un archivo pom.xml
sin opciones propias, prácticamente vacío, estará usando el modelo de objetos para definir los valores por defecto del mismo. Por ejemplo, por defecto, el directorio donde está el código fuente es src/main/java
, donde se compila el proyecto es target
y donde ubicamos los test unitarios es en src/main/test
, etc... Al pom.xml
global, con los valores predeterminados se le llama Súper POM.
Esta sería la estructura habitual de un proyecto Java que utiliza Maven:
Este es el contenido de un archivo pom.xml
sencillo de ejemplo:
<project>
<modelVersion>4.0.0</modelVersion>
<groupId>es.campusmvp</groupId>d>
<artifactId>demo</artifactId>
<version>1.0</version>
<!-- Dependencias -->
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
<exclusions>
<exclusion>
<groupId>org.junit.vintage</groupId>
<artifactId>junit-vintage-engine</artifactId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>org.apache.tomcat.embed</groupId>
<artifactId>tomcat-embed-jasper</artifactId>
<scope>compile</scope>
</dependency>
</dependencies>
</project>
Como puedes ver incluye una serie de dependencias: la primera es el starter de Spring Boot para generar una aplicación Web, la segunda es el starter que trae todas las dependencias para poder ejecutar test (por ejemplo JUnit o Mockito) y que excluye todo lo relativo al motor antiguo de JUnit 4. La final añade el soporte para JSP en el servidor Apache Tomcat.
Los 4 primeros nodos son los únicos obligatorios y definen respectivamente el modelo de objetos que utilizará Maven, el identificador del grupo del proyecto, el id del proyecto (artifact) y su versión. Esto es lo mínimo que debe incluir el archivo si utilizamos Maven y la mayor parte de los editores y herramientas nos lo crearán automáticamente al crear el proyecto.
Herencia de POMs
Dentro de un proyecto pueden existir varios archivos pom.xml
en distintas subcarpetas. Cuando una subcarpeta tiene su propio POM, este hereda los valores de las carpetas superiores, sobrescribiéndolos en caso de estar definidos de nuevo dentro de él.
De hecho el archivo pom.xml
que tenemos en la raíz está actuando ya de esta manera: hereda todos los valores del Súper POM que son los que tenemos por defecto y, si en nuestro pom.xml
propio en el proyecto establecemos otros diferentes, estos prevalecerán sobre los que hay en el Súper POM.
Este tipo de funcionamiento es típico en muchas herramientas de configuración y nos ofrece una manera muy potente de definir valores particulares para casos concretos teniendo una configuración global por defecto.
En resumen
En este artículo solo se pretendía explicarte de manera directa y concisa qué es Maven y qué son los archivos POM y cómo funcionan. En realidad Maven y su configuración son mucho más complejos ya que te permiten hacer agregación de configuraciones para reutilizar módulos entre proyectos padres e hijos, interpolar POMs para usar unas configuraciones dentro de otras, definir y usar variables y algunas cuestiones avanzadas más. En los anteriores enlaces encontrarás más detalles sobre todo esto.
Espero que te haya servido para orientarte si estas empezando y si quieres aprender Spring Boot, tenemos un excelente curso 😉