W3docs

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.

ScopeEn classpath de compilaciónEn classpath de pruebaEmpaquetadoUso típico
compile (predeterminado)Bibliotecas normales
providedNoServlet API, suministrada en tiempo de ejecución
runtimeNoControladores JDBC
testNoNoJUnit, 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 fresh

Cada 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.

java— editable, runs on the server

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.0 se lee igual que una línea de dependencia.
  • Solo se declaran dos dependencias, pero el classpath resuelto tiene cuatro JARs — spring-core y jackson-annotations fueron incluidos transitivamente, exactamente como lo hace Maven.
  • El conjunto seen garantiza 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 package ejecuta validate, compile y test antes de package y luego se detiene — ejecutar una fase siempre ejecuta cada fase anterior en orden.
  • La compilación se detiene en package y nunca llega a install, 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

Práctica

Práctica
En Maven, ¿qué ocurre cuando ejecutas 'mvn package'?
En Maven, ¿qué ocurre cuando ejecutas 'mvn package'?
Was this page helpful?