Translate

lunes, 7 de mayo de 2012

MAVEN: Eliminar las dependencias transitivas de tu POM.xml


Remove transitive dependencies from your pom.xml

Prerequistos: Conocimientos básicos de MAVEN y la configuración de las dependencias de un proyecto en el pom.xml.

El objetivo de eliminar las dependencias transitivas es porque no quiero que las dependencias de mis proyectos  descarguen sus propias dependencias ya que en la mayoría de casos es innecesaria.

Por ejemplo imaginemos que tenemos el siguiente caso:

  • ProyectoPrincipal
    • Dependencias
      • ProyectoApi
    • genera un archivo WAR: ProyectoPrincipal.war
  • ProyectoApi
    • Dependencias
      • ProyectoLibrería
    • genera un archivo JAR  ProyectoApi.jar.
  • ProyectoLibrería
    • Dependencias (ninguna)
    • genera un archivo JAR: ProyectoLibrería.jar


Con esta estructura de dependencias, cuando miro los JAR que hay en las dependencias de MAVEN del proyecto principal y veo los dos archivos jar.
  • ProyectoApi.jar
  • ProyectoLibrería.jar
Cuando lo que yo quiero es que sólo aparezca la librería ProyectoApi.jar

Cuando tienes pocos proyectos dependientes puede resultar cómodo pero cuando tienes muchos puede liarte mucho e incluso mezclar archivos jar de otros proyectos que no son necesarios.

Yo prefiero por mi mismo poner el en POM del ProyectoPrincipal las dos dependencias si son necesarias y no que MAVEN lo haga por si mismo.

Para evitar que MAVEN descargue las dependencias transitivas del proyectoApi tenemos que añadir el apartado <exclusions> para evitarlo.

Ejemplo:

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
  <modelVersion>4.0.0</modelVersion>
  <groupId>org.antuansoft</groupId>
  <artifactId>ProyectoPrincipal</artifactId>
  <version>1.0.0</version>
  <groupId>org.antuansoft</groupId>
  <packaging>war</packaging> 

  <dependencies>

  <dependency>
       <artifactId>ProyectoApi</artifactId>
       <version>1.0.0</version>
       <exclusions>
          <exclusion>
              <groupId>*</groupId>
              <artifactId>*</artifactId>
          </exclusion>
        </exclusions>
     </dependency>
 
 .......

  <dependencies>
 
 .....
 
</project> 



2 comentarios:

  1. ¿Y si la dependencia es cíclica? (es decir, por ejemplo que 'ProyectoLibrería' tuviese dependencia con 'ProyectoApi')

    ResponderEliminar
  2. Si tienes una dependencia ciclica maven no te deja compilar.
    Deberia darte un mensaje de error y tendrias que resolver esa dependencia si quieres que tu proyecto funcione.

    ResponderEliminar