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

管理依赖 Maven

Une des caractéristiques centrales de Maven est la gestion des dépendances. Lorsque nous traitons des projets à multiples modules (comprendant des centaines ou des milliers de modules ou sous-projets), les relations de dépendance entre les modules deviennent très complexes et la gestion devient difficile. Dans ce cas, Maven fournit une méthode de contrôle élevé.

Détection des dépendances transitives

Un cas assez courant, par exemple, si A dépend d'une autre bibliothèque B. Si un autre projet C souhaite utiliser A, alors le projet C doit également utiliser la bibliothèque B.

Maven peut éviter de rechercher toutes les bibliothèques nécessaires. Maven trouve les relations de dépendance entre les projets en lisant les fichiers de projet (pom.xml).

Nous devons simplement définir les relations de dépendance directes dans le pom de chaque projet. Les autres choses, Maven les réglera pour nous.

Grâce à la dépendance transitive, la taille des graphiques de toutes les bibliothèques incluses augmente rapidement. Lorsque des bibliothèques répétées apparaissent, les situations possibles continueront à augmenter. Maven fournit certaines fonctionnalités pour contrôler l'étendue des dépendances transitives.

FonctionDescription de la fonction
Ajustement des dépendancesDéterminer quel version de dépendance sera utilisée lorsque plusieurs versions créées manuellement apparaissent en même temps. Si deux versions de dépendance ont la même profondeur dans l'arbre de dépendance, la dépendance déclarée en premier sera utilisée.
Gestion des dépendancesSpécification directe d'une version manuellement créée utilisée. Par exemple, lorsqu'un projet C contient le projet B dans son module de gestion des dépendances, c'est-à-dire que B dépend de A, alors A peut spécifier la version utilisée lorsque B est mentionné.
Portée de la dépendanceDépendances incluses dans chaque étape du processus de construction.
Exclusion de la dépendanceToute dépendance transitoire peut être exclue à l'aide de l'élément "exclusion" par exemple, A dépend de B, B dépend de C, par conséquent, A peut marquer C comme "exclu".
Dépendance optionnelleToute dépendance transitoire peut être marquée comme optionnelle en utilisant l'élément "optional" par exemple : A dépend de B, B dépend de C. Par conséquent, B peut marquer C comme optionnel, de sorte que A n'utilisera plus C.

Portée de la dépendance

La découverte des dépendances transitoires peut être limitée en utilisant les portées de dépendances suivantes :

PortéeDescription
Étape de compilationCette portée indique que les dépendances concernées ne sont valables que dans la classepath du projet. Valeur par défaut.
Étape de distributionCette portée indique que les dépendances concernées sont fournies par le JDK ou le serveur réseau à l'exécution.
Étape d'exécutionCette portée indique que les dépendances concernées ne sont pas nécessaires pendant la phase de compilation, mais sont nécessaires pendant la phase d'exécution.
Étape de testCette portée indique que les dépendances concernées ne sont valables que pendant les étapes de compilation et d'exécution du test.
Étape systèmeCette portée indique que vous devez fournir un chemin système.
Étape d'importationCette portée est utilisée uniquement lorsque la dépendance est définie dans un fichier pom. En même temps, les dépendances définies dans la section dépendances du fichier pom du projet actuel peuvent remplacer un fichier POM spécifique.

Gestion des dépendances

Dans le cas d'un projet commun, plusieurs projets peuvent être créés. Dans ce cas, nous pouvons créer un fichier pom de dépendances commun, qui contient toutes les dépendances communes, et nous l'appelons le pom père des autres sous-projets pom. Un exemple suivant peut vous aider à mieux comprendre ce concept.

Gestion des dépendances

  • App-UI-Voici une explication détaillée du graphique de dépendances ci-dessus :-Core-lib 和 App-Data-WAR dépend de App

  • La racine est lib.-Core-lib 和 App-Data-le projet parent de lib.

  • La racine définit Lib dans sa section dépendances1、lib2 et Lib3 comme dépendance.

App-UI-Le code du fichier pom.xml de WAR est le suivant :

<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-Le code du fichier pom.xml de lib est le suivant :

<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-Le code du fichier pom.xml de lib est le suivant :

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

Le code du fichier pom.xml de la racine est le suivant :

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

现在当我们构建 App-UI-在构建 WAR 项目时,Maven 将通过遍历依赖关系图找到所有的依赖关系,并构建该应用程序。

通过上面的实例,我们可以学习以下关键概念:

  • 公共的依赖可以使用 pom 父的概念统一放在一起。App-Data-lib 和 App-Core-lib 项目的依赖在 Root 项目中列出(参考 Root 的包类型,它是一个 POM)。

  • 在 App 中没有必要-UI-在 W 中声明 Lib1, lib2, Lib3 这是它的依赖。Maven 通过使用可传递的依赖机制来实现这一细节。