Introducción a Java Maven
Qué es Maven, cómo compila proyectos Java y cómo instalar y ejecutar comandos mvn.
Maven es la herramienta estándar de automatización de compilación y gestión de dependencias para Java. Convierte un proyecto en una descripción declarativa — qué es, de qué depende, cómo se construye — y luego ejecuta la compilación por ti. En lugar de gestionar manualmente archivos JAR y opciones de javac, declaras tus necesidades en un único archivo y Maven descarga dependencias, compila, prueba y empaqueta tu código a través de un ciclo de vida predecible y reproducible.
El POM: un proyecto como datos
Todo proyecto Maven se describe mediante un pom.xml (Project Object Model). Identifica el proyecto con tres coordenadas — groupId, artifactId y version (juntas forman el "GAV") — y lista las bibliotecas que necesita. El mismo esquema de coordenadas nombra tu proyecto y cada dependencia, que es como Maven localiza los artefactos en un repositorio.
<project xmlns="http://maven.apache.org/POM/4.0.0">
<modelVersion>4.0.0</modelVersion>
<groupId>com.example</groupId>
<artifactId>shop-app</artifactId>
<version>1.0.0</version>
<packaging>jar</packaging>
<properties>
<maven.compiler.release>21</maven.compiler.release>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-web</artifactId>
<version>6.1.0</version>
</dependency>
</dependencies>
</project>El elemento <packaging> indica a Maven qué producir (jar, war, pom). El bloque <properties> contiene valores reutilizables — aquí, la versión de Java que el compilador tiene como objetivo. El POM crece para cubrir plugins, perfiles y herencia; el capítulo sobre el POM de Maven desglosa esas partes.
Dependencias y el classpath transitivo
Solo listas tus dependencias directas. Maven lee el POM de cada dependencia y obtiene todo lo que ellas necesitan — las dependencias transitivas — construyendo el classpath completo automáticamente. Declarar spring-web también incluye spring-core sin que tengas que nombrarlo.
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
<version>2.17.0</version>
</dependency>Cada dependencia tiene un scope que controla cuándo está en el classpath. El predeterminado, compile, lo hace disponible en todas partes; test lo limita al código de prueba; provided significa que el entorno de ejecución lo suministra. Para conflictos de versiones, exclusiones y dependencyManagement, consulta dependencias de Maven.
| Scope | En classpath de compilación | En classpath de prueba | Empaquetado | Uso típico |
|---|---|---|---|---|
compile (predeterminado) | Sí | Sí | Sí | Bibliotecas normales |
provided | Sí | Sí | No | Servlet API, suministrada en tiempo de ejecución |
runtime | No | Sí | Sí | Controladores JDBC |
test | No | Sí | No | JUnit, Mockito |
El ciclo de vida de la compilación
Las compilaciones de Maven recorren una secuencia fija de fases. Las fases clave del ciclo de vida predeterminado son validate, compile, test, package, verify, install y deploy. Ejecutar una fase ejecuta cada fase anterior — mvn package primero valida, compila y prueba, y luego empaqueta. Nunca se llaman las fases fuera de orden.
mvn compile # compile main sources
mvn test # compile + run unit tests
mvn package # compile + test + build the JAR/WAR
mvn install # package + copy artifact into your local repository
mvn clean package # delete target/ first, then build freshCada fase está vinculada a uno o más goals proporcionados por plugins (por ejemplo, compiler:compile está vinculado a la fase compile). Los plugins son donde reside el trabajo real; el ciclo de vida solo lo ordena. El capítulo sobre el ciclo de vida de compilación de Maven recorre los tres ciclos de vida integrados y cómo los goals se vinculan a las fases.
Repositorios
Maven obtiene artefactos de los repositorios. Al compilar, busca primero en tu repositorio local (~/.m2/repository), una caché en tu máquina. Si no lo encuentra, lo descarga de un repositorio remoto — por defecto Maven Central — y almacena una copia localmente para que la siguiente compilación sea rápida sin conexión. Los equipos a menudo añaden un repositorio privado para bibliotecas internas.
project pom.xml → local repo (~/.m2) → remote repo (Maven Central)
(cache hit?) (download + cache)Un ejemplo ejecutable
El ejecutor de código no tiene Maven en su classpath, por lo que el programa siguiente modela la mecánica central de Maven con código JDK puro: almacena un pequeño POM como un mapa, resuelve el cierre de dependencias transitivas (eliminando artefactos duplicados) y recorre el ciclo de vida de la compilación, deteniéndose en la fase solicitada. Las formas aquí — coordenadas GAV, resolución transitiva, fases ordenadas — son exactamente lo que hace Maven real.
Lo que se puede extraer de la ejecución:
- El proyecto y cada dependencia se nombran con la misma triple GAV, por eso
Project coordinates: com.example:shop-app:1.0.0se lee igual que una línea de dependencia. - Solo se declaran dos dependencias, pero el classpath resuelto tiene cuatro JARs —
spring-coreyjackson-annotationsfueron incluidos transitivamente, exactamente como lo hace Maven. - El conjunto
seengarantiza que cada artefacto aparezca una sola vez; esta es la deduplicación de Maven que evita que una biblioteca compartida quede en el classpath dos veces. Executing: mvn packageejecutavalidate,compileytestantes depackagey luego se detiene — ejecutar una fase siempre ejecuta cada fase anterior en orden.- La compilación se detiene en
packagey nunca llega ainstall, reflejando cómo el goal solicitado limita hasta dónde avanza el ciclo de vida.
Cuándo usar Maven
Maven destaca en proyectos Java y JVM convencionales: sus valores predeterminados de "convención sobre configuración" (fuentes en src/main/java, pruebas en src/test/java, salida en target/) significan que un nuevo colaborador puede compilar cualquier proyecto Maven de la misma manera. Su XML declarativo es fácil de leer y comparar, y el soporte de IDE es maduro. La contrapartida es la verbosidad y la flexibilidad limitada para compilaciones inusuales. Donde necesitas compilaciones muy personalizadas y con scripts, Gradle es la alternativa habitual — usa un script de compilación programable en lugar de XML declarativo, pero cubre el mismo terreno: coordenadas GAV, dependencias transitivas y un grafo de tareas (en lugar de fases).
Próximos pasos
- POM de Maven — la estructura completa de
pom.xml, incluyendo plugins y herencia. - Dependencias de Maven — scopes, exclusiones y resolución de conflictos de versiones en profundidad.
- Ciclo de vida de compilación de Maven — cada fase, los tres ciclos de vida y la vinculación de goals.
- Introducción a Gradle — la alternativa basada en scripts a Maven.