English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية

Gestión de dependencias de Maven

Una característica nuclear de Maven es la gestión de dependencias. Cuando manejamos proyectos de múltiples módulos (que contienen cientos o miles de módulos o subproyectos), las relaciones de dependencia entre módulos se vuelven muy complejas y la gestión se vuelve muy difícil. Para este tipo de situación, Maven proporciona un método de alta gestión.

Descubrimiento de dependencias transitivas

Una situación bastante común, por ejemplo, A depende de otra biblioteca B. Si, otro proyecto C desea usar A, entonces el proyecto C también necesita usar la biblioteca B.

Maven puede evitar la búsqueda de todas las necesidades de bibliotecas necesarias. Maven encuentra las relaciones de dependencia entre proyectos leyendo el archivo de proyecto (pom.xml).

Lo que necesitamos hacer es definir bien las relaciones de dependencia directas en el pom de cada proyecto. Otras cosas las resolverá Maven por nosotros.

A través de la dependencia transitable, el gráfico de todas las bibliotecas incluidas crecerá rápidamente. Cuando haya bibliotecas repetidas, las situaciones posibles seguirán aumentando. Maven proporciona algunas funciones para controlar el grado de dependencia transitable.

FunciónDescripción de la función
Ajuste de dependenciasDecidir qué versión de dependencia se utilizará cuando aparezcan múltiples versiones creadas manualmente al mismo tiempo. Si dos versiones de dependencia tienen la misma profundidad en el árbol de dependencias, se utilizará la dependencia declarada primero.
Gestión de dependenciasEspecificación directa de una versión creada manualmente. Por ejemplo, cuando un proyecto C incluye en su módulo de gestión de dependencias al proyecto B, es decir, B depende de A, entonces A puede especificar la versión utilizada cuando se hace referencia a B.
Rango de dependenciasIncluye dependencias en cada fase del proceso de construcción.
Exclusión de dependenciasCualquier dependencia transitiva puede excluirse utilizando el elemento "exclusion". Por ejemplo, A depende de B, B depende de C. Por lo tanto, A puede marcar C como "excluido".
Dependencia opcionalCualquier dependencia transitiva puede marcarse como opcional utilizando el elemento "optional". Por ejemplo: A depende de B, B depende de C. Por lo tanto, B puede marcar C como opcional, de modo que A ya no utilice C.

Rango de dependencias

El descubrimiento de dependencias transitivas se puede limitar utilizando los siguientes rangos de dependencias:

RangoDescripción
Fase de compilaciónEste rango indica que las dependencias relevantes solo son válidas en la clasepath del proyecto. Valor predeterminado.
Fase de suministroEste rango indica que las dependencias relevantes se proporcionan por el JDK en tiempo de ejecución o por el servidor de red.
Fase de ejecuciónEste rango indica que las dependencias relevantes no son necesarias en la fase de compilación, pero son necesarias en la fase de ejecución.
Fase de pruebaEste rango indica que las dependencias relevantes solo están disponibles en las fases de compilación de prueba y ejecución.
Fase del sistemaEste rango indica que necesitas proporcionar una ruta de sistema.
Fase de importaciónEste rango se utiliza solo cuando la dependencia se define en un pom. Al mismo tiempo, las dependencias definidas en la sección de la parte superior del archivo pom del proyecto actual pueden reemplazar un pom específico.

Gestión de dependencias

En la mayoría de los casos, en un proyecto común, hay una serie de proyectos. En este caso, podemos crear un archivo pom de dependencias comunes que contiene todas las dependencias comunes, que llamamos el pom padre de otros pom de subproyectos. Un siguiente ejemplo puede ayudarte a comprender mejor este concepto.

Gestión de dependencias

  • App-UI-A continuación, se detalla la información detallada del diagrama de dependencias anterior:-Core-lib y App-Data-WAR depende de App

  • La raíz es lib.-Core-lib y App-Data-el proyecto padre de lib.

  • La raíz define Lib en su sección de dependencias.1、lib2 y Lib3 como dependencia.

App-UI-El código del archivo pom.xml de WAR es el siguiente:

<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>com.companyname.groupname</<groupId>
      <artifactId>App-UI-WAR</<artifactId>
      <version>1.0</version>
      <packaging>war</packaging>
      <dependencies>
         <dependency>
            <groupId>com.companyname.groupname</<groupId>
            <artifactId>App-Core-lib</<artifactId>
            <version>1.0</version>
         </dependency>
      </dependencies>  
      <dependencies>
         <dependency>
            <groupId>com.companyname.groupname</<groupId>
            <artifactId>App-Data-lib</<artifactId>
            <version>1.0</version>
         </dependency>
      </dependencies>  
</project>

App-Core-El código del archivo pom.xml de lib es el siguiente:

<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">
      <parent>
         <artifactId>Root</<artifactId>
         <groupId>com.companyname.groupname</<groupId>
         <version>1.0</version>
      </parent>
      <modelVersion>4.0.0</modelVersion>
      <groupId>com.companyname.groupname</<groupId>
      <artifactId>App-Core-lib</<artifactId>
      <version>1.0</version> 
      <packaging>jar</packaging>
</project>

App-Data-El código del archivo pom.xml de lib es el siguiente:

<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">
      <parent>
         <artifactId>Root</<artifactId>
         <groupId>com.companyname.groupname</<groupId>
         <version>1.0</version>
      </parent>
      <modelVersion>4.0.0</modelVersion>
      <groupId>com.companyname.groupname</<groupId>
      <artifactId>App-Data-lib</<artifactId>
      <version>1.0</version>   
      <packaging>jar</packaging>
</project>

El código del archivo pom.xml de la raíz es el siguiente:

<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>com.companyname.groupname</<groupId>
      <artifactId>Root</<artifactId>
      <version>1.0</version>
      <packaging>pom</packaging>
      <dependencies>
         <dependency>
            <groupId>com.companyname.groupname1</<groupId>
            <artifactId>Lib1</<artifactId>
            <version>1.0</version>
         </dependency>
      </dependencies>  
      <dependencies>
         <dependency>
            <groupId>com.companyname.groupname2</<groupId>
            <artifactId>Lib2</<artifactId>
            <version>2.1</version>
         </dependency>
      </dependencies>  
      <dependencies>
         <dependency>
            <groupId>com.companyname.groupname3</<groupId>
            <artifactId>Lib3</<artifactId>
            <version>1.1</version>
         </dependency>
      </dependencies>  
</project>

Ahora, cuando construimos App-UI-Al construir un proyecto WAR, Maven encontrará todas las dependencias mediante el análisis del grafo de dependencias y construirá la aplicación.

A través del ejemplo anterior, podemos aprender los siguientes conceptos clave:

  • Las dependencias públicas pueden agruparse en una única ubicación utilizando el concepto de padre pom. App-Data-lib y App-Core-las dependencias del proyecto lib se enumeren en el proyecto Root (consulte el tipo de paquete de Root, que es un POM).

  • No es necesario que en App-UI-Se declara Lib en W1, lib2, Lib3 Es su dependencia. Maven realiza este detalle mediante el mecanismo de dependencias transitivas.