Apache Maven es una herramienta de automatización de construcción (build automation) para proyectos Java. Toma tu código fuente y produce un entregable (un archivo .jar o .war) orquestando todas las etapas: compilación, pruebas, empaquetado, gestión de dependencias.
En concreto, Maven responde a tres necesidades fundamentales:
| Necesidad | Lo que hace Maven |
|---|---|
| Construir el proyecto | Compila el código y produce un artefacto (.jar, .war) |
| Gestionar las dependencias | Descarga automáticamente las bibliotecas necesarias |
| Estandarizar | Impone una estructura de proyecto idéntica en todas partes |
El corazón de Maven es un archivo único, el pom.xml (Project Object Model), que describe el proyecto: su identidad, sus dependencias y la forma de construirlo. Es la «receta» que Maven ejecuta.
Sin Maven, construir un proyecto Java significa compilar a mano con
javac, descargar cada biblioteca manualmente y gestionar uno mismo el classpath. Maven automatiza todo eso a partir de un solo archivo.
🔧 Mini-ejercicio — Cita las tres necesidades fundamentales a las que Maven responde.
Construir el proyecto (compilar + producir un artefacto .jar/.war), gestionar las dependencias (descargar las bibliotecas) y estandarizar (imponer una estructura de proyecto idéntica).
Antes de Maven, cada proyecto Java se construía «a mano» o con scripts caseros. Eso planteaba varios problemas recurrentes:
| Problema (sin Maven) | Solución (con Maven) |
|---|---|
Encontrar y descargar los .jar uno a uno | Declaración en el pom.xml, descarga automática |
| Conflictos de versiones de bibliotecas | Resolución transitiva automática |
| «Compila en mi máquina pero no en la tuya» | Build reproducible y estandarizado |
| Cada proyecto organizado de forma distinta | Estructura de carpetas impuesta |
La idea maestra: un desarrollador que se une a un proyecto Maven sabe de inmediato dónde está el código, dónde están las pruebas y cómo lanzar la construcción, da igual la empresa o el proyecto.
# Con Maven, construir un proyecto desconocido se resume a:
mvn packageMaven transforma «¿cómo se construye este proyecto?» —una pregunta que a veces costaba horas— en un solo comando universal.
🔧 Mini-ejercicio — Escribe el único comando que basta para construir un proyecto Maven desconocido.
mvn packageEl principio central de Maven es «convención antes que configuración» (convention over configuration). En lugar de describirlo todo de forma explícita, Maven parte de valores por defecto sensatos. Si respetas las convenciones, casi no tienes nada que configurar.
Ejemplos de convenciones por defecto:
| Elemento | Ubicación esperada por defecto |
|---|---|
| Código fuente principal | src/main/java |
| Recursos principales | src/main/resources |
| Código de prueba | src/test/java |
| Artefacto producido | target/ |
Comparemos las filosofías:
| Enfoque | Consecuencia |
|---|---|
| Configurarlo todo | Flexible pero verboso, propenso a errores |
| Convención por defecto | Conciso, coherente entre proyectos, rápido para empezar |
Siempre puedes redefinir las convenciones si hace falta, pero el 95 % de los proyectos se conforma con los valores por defecto. Menos configuración = menos bugs.
Todo proyecto Maven sigue la misma arborescencia. Conocerla permite navegar al instante en cualquier proyecto.
Detalle de las carpetas:
| Ruta | Rol |
|---|---|
pom.xml | La receta del proyecto (en la raíz) |
src/main/java | El código fuente de la aplicación |
src/main/resources | Archivos no Java (.properties, .xml, imágenes) |
src/test/java | Las clases de pruebas unitarias |
src/test/resources | Recursos usados por las pruebas |
target/ | Carpeta de salida: clases compiladas y artefacto final |
🔧 Mini-ejercicio — ¿En qué carpeta debes colocar una clase de prueba unitaria, y en cuál un archivo application.properties?
La prueba unitaria va en src/test/java, y application.properties en src/main/resources.
# Arborescencia típica vista en la línea de comandos
mon-projet/
├── pom.xml
├── src/
│ ├── main/
│ │ ├── java/ # ej. com/exemple/App.java
│ │ └── resources/ # ej. application.properties
│ └── test/
│ └── java/ # ej. com/exemple/AppTest.java
└── target/ # generado: no versionar (.gitignore)⚠️ La carpeta
target/se regenera en cada build. Añádela a tu.gitignore: nunca se versionan los artefactos compilados.
Maven necesita un JDK (Java Development Kit) ya instalado, porque se apoya en el compilador javac. La variable JAVA_HOME debe apuntar a ese JDK.
Según tu sistema:
| Sistema | Comando de instalación |
|---|---|
| Windows (con Chocolatey) | choco install maven |
| macOS (con Homebrew) | brew install maven |
| Linux (Debian/Ubuntu) | sudo apt install maven |
Instalación manual (todas las plataformas):
# 1. Verificar primero que Java está presente
java -version
# Debe mostrar una versión 17+ por ejemplo
# 2. Definir JAVA_HOME (ejemplo Linux/macOS)
export JAVA_HOME=/usr/lib/jvm/java-17-openjdk
# 3. Descargar Maven desde maven.apache.org, descomprimir,
# luego añadir la carpeta bin/ al PATH
export PATH=$PATH:/opt/apache-maven-3.9.6/binEn Windows,
JAVA_HOMEse configura en «Variables de entorno». En Linux/macOS, añade la líneaexporta tu~/.bashrco~/.zshrcpara que sea permanente.
Una vez Maven instalado, se verifica que funciona y se genera un primer esqueleto de proyecto.
# Verificar la versión instalada
mvn -versionSalida típica:
Apache Maven 3.9.6
Maven home: /opt/apache-maven-3.9.6
Java version: 17.0.9, vendor: Eclipse AdoptiumPara generar un proyecto vacío que respete las convenciones, se usa un arquetipo (una plantilla):
# Genera un proyecto «quickstart» estándar
mvn archetype:generate \
-DgroupId=com.exemple \
-DartifactId=mon-app \
-DarchetypeArtifactId=maven-archetype-quickstart \
-DinteractiveMode=false| Comando | Efecto |
|---|---|
mvn -version | Muestra la versión de Maven y de Java |
mvn archetype:generate | Genera un proyecto a partir de una plantilla |
mvn package | Construye el artefacto en target/ |
El primer
mvnes lento: Maven descarga sus propios plugins en una caché local (~/.m2/repository). Los builds siguientes son mucho más rápidos.
🔧 Mini-ejercicio — Escribe el comando que muestra la versión de Maven instalada (y la de Java).
mvn -version¿Qué designa el archivo pom.xml en un proyecto Maven?
a) El código fuente principal de la aplicación
b) El Project Object Model: la receta que describe el proyecto y su build
c) El resultado compilado del proyecto
d) Un archivo de logs
✅ Respuesta: b) — El pom.xml (Project Object Model) describe la identidad del proyecto, sus dependencias y la forma de construirlo.
¿Dónde espera Maven encontrar por defecto el código fuente principal?
a) code/
b) target/main
c) src/main/java
d) java/source
✅ Respuesta: c) — Por convención, el código principal va en src/main/java, y las pruebas en src/test/java.
¿Qué significa «convención antes que configuración»?
a) Hay que configurarlo todo de forma explícita
b) Maven usa valores por defecto sensatos, lo que reduce la configuración necesaria
c) Nunca se puede cambiar el comportamiento de Maven
d) Maven no tiene archivo de configuración
✅ Respuesta: b) — Al respetar las convenciones por defecto, el pom.xml permanece mínimo. Siempre se puede redefinir una convención si hace falta.
¿Qué carpeta genera Maven automáticamente y no debe versionarse?
a) src/main/java
b) src/test/java
c) target/
d) resources/
✅ Respuesta: c) — target/ contiene las clases compiladas y el artefacto; se regenera en cada build y debe figurar en .gitignore.
¿Qué necesita Maven para funcionar?
a) Un servidor web
b) Un JDK instalado y JAVA_HOME configurado
c) Una base de datos
d) Node.js
✅ Respuesta: b) — Maven se apoya en el compilador javac del JDK; JAVA_HOME debe apuntar a ese JDK.
pom.xml es el Project Object Model: identidad, dependencias y receta de build.src/main/java.target/ se regenera en cada build y no se versiona.JAVA_HOME apuntando a ese JDK.Verifica tu instalación de Maven, genera un proyecto «quickstart» llamado mon-app en el grupo com.exemple, luego constrúyelo y localiza el artefacto producido.
# 1. Verificar Maven y Java
mvn -version
# 2. Generar el proyecto a partir del arquetipo quickstart
mvn archetype:generate \
-DgroupId=com.exemple \
-DartifactId=mon-app \
-DarchetypeArtifactId=maven-archetype-quickstart \
-DinteractiveMode=false
# 3. Entrar en el proyecto e inspeccionar la estructura
cd mon-app
ls -R # o «tree» si está disponible
# 4. Construir el proyecto
mvn package
# 5. Localizar el artefacto generado
ls target/Resultado esperado:
target/
├── classes/
├── mon-app-1.0-SNAPSHOT.jar <-- el artefacto producido
└── ...
BUILD SUCCESSLa arborescencia generada debe contener:
mon-app/
├── pom.xml
└── src/
├── main/java/com/exemple/App.java
└── test/java/com/exemple/AppTest.javaSi
mvn packagemuestraBUILD SUCCESSy aparece un.jarentarget/, tu cadena Maven está operativa. El sufijo-SNAPSHOTindica una versión en curso de desarrollo (véase la lección 02).
pom.xml es la receta única que describe el proyecto y su build.src/main/java, src/test/java, src/main/resources, salida en target/.JAVA_HOME; se verifica con mvn -version.Lección 02 — El archivo pom.xml: diseccionar en detalle la receta de Maven — coordenadas del proyecto, propiedades y herencia parent.
Todos los derechos reservados. Toda reproducción, difusión, uso o adaptación de este curso, en todo o en parte, está estrictamente prohibida sin la autorización escrita previa del Dr. Haythem REHOUMA.
Curso creado por Dr. Haythem REHOUMA — Desarrollo y despliegue de soluciones de datos