Objetivo del tema
En este tema aprenderás a declarar dependencias en Apache Maven, gestionar versiones, comprender los alcances disponibles, centralizar configuraciones con dependencyManagement
, interactuar con repositorios remotos y resolver conflictos derivados de dependencias transitivas.
Las dependencias se definen en la sección <dependencies>
del POM. Cada objeto describe las coordenadas del artefacto deseado: groupId
, artifactId
y version
. Maven descarga el artefacto desde el repositorio correspondiente y lo agrega al classpath según su alcance.
<dependencies>
<dependency>
<groupId>com.google.guava</groupId>
<artifactId>guava</artifactId>
<version>33.1.0-jre</version>
</dependency>
</dependencies>
Elegir versiones adecuadas es clave para garantizar estabilidad y compatibilidad. Maven permite fijar versiones exactas, emplear sufijos o utilizar rangos para admitir varias variantes.
[1.0,2.0)
permiten aceptar versiones dentro de un intervalo, aunque requieren análisis para evitar incompatibilidades.Unifica las versiones mediante propiedades para facilitar actualizaciones globales y minimizar el riesgo de divergencias.
El atributo <scope>
determina en qué fases del ciclo de vida se usará la dependencia y si se empaquetará dentro del artefacto final.
dependencyManagement
para importar bill of materials (BOMs).Seleccionar el alcance correcto evita empaquetar bibliotecas innecesarias y reduce conflictos en tiempo de ejecución.
La sección <dependencyManagement>
permite centralizar versiones sin agregarlas automáticamente al classpath. Los módulos hijos pueden declarar dependencias sin especificar versión y heredar los valores fijados.
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-dependencies</artifactId>
<version>3.2.5</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
Además del repositorio central, Maven puede consultar repositorios remotos adicionales definidos en el POM o en settings.xml
. Esto es común en organizaciones que alojan componentes internos o espejos de artefactos públicos.
<repositories>
<repository>
<id>repositorio-interno</id>
<url>https://artifactory.miempresa.com/maven-release</url>
<releases>
<enabled>true</enabled>
</releases>
<snapshots>
<enabled>false</enabled>
</snapshots>
</repository>
</repositories>
settings.xml
mediante la sección <servers>
para evitar exponerlas en el POM.Cuando una dependencia incluye otras bibliotecas, Maven las incorpora de forma transitiva. Aunque esto simplifica la configuración, puede provocar conflictos de versión o inclusiones innecesarias.
mvn dependency:tree
para visualizar el grafo completo y detectar origenes de cada dependencia.<exclusion>
dentro de la dependencia que los trae.<dependencyManagement>
para forzar la resolución cuando existen versiones divergentes.maven-dependency-plugin
o OWASP Dependency-Check.Gestionar activamente las dependencias transitivas evita incompatibilidades en ejecución y permite cumplir políticas de seguridad corporativas.
Maven ofrece mecanismos declarativos para controlar dependencias y repositorios: desde la simple declaración en el POM hasta la centralización con dependencyManagement
y el uso de repositorios privados. Comprender los alcances, el versionado y la gestión de transitividades es crucial para construir artefactos consistentes y seguros.