Maven - Gérer les dépendances
L'une des principales fonctionnalités de Maven est la gestion des dépendances. La gestion des dépendances est une tâche difficile une fois que nous avons affaire à des projets multi-modules (composés de centaines de modules / sous-projets). Maven offre un degré élevé de contrôle pour gérer de tels scénarios.
Découverte des dépendances transitives
C'est assez souvent un cas, lorsqu'une bibliothèque, disons A, dépend d'une autre bibliothèque, disons B. Dans le cas où un autre projet C veut utiliser A, alors ce projet doit également utiliser la bibliothèque B.
Maven permet d'éviter de telles exigences pour découvrir toutes les bibliothèques requises. Maven le fait en lisant les fichiers de projet (pom.xml) des dépendances, en identifiant leurs dépendances et ainsi de suite.
Il suffit de définir la dépendance directe dans chaque projet pom. Maven gère le reste automatiquement.
Avec les dépendances transitives, le graphique des bibliothèques incluses peut rapidement se développer dans une large mesure. Des cas peuvent survenir lorsqu'il existe des bibliothèques en double. Maven fournit peu de fonctionnalités pour contrôler l'étendue des dépendances transitives.
Sr.No. | Description des fonctions |
---|---|
1 | Dependency mediation Détermine la version d'une dépendance à utiliser lorsque plusieurs versions d'un artefact sont rencontrées. Si deux versions de dépendances sont à la même profondeur dans l'arborescence de dépendances, la première dépendance déclarée sera utilisée. |
2 | Dependency management Spécifiez directement les versions des artefacts à utiliser lorsqu'ils sont rencontrés dans des dépendances transitives. Pour un exemple de projet, C peut inclure B en tant que dépendance dans sa section de gestion des dépendances et contrôler directement la version de B à utiliser lorsqu'elle est référencée. |
3 | Dependency scope Inclut les dépendances selon l'étape actuelle de la construction. |
4 | Excluded dependencies Toute dépendance transitive peut être exclue à l'aide de l'élément "exclusion". Par exemple, A dépend de B et B dépend de C, alors A peut marquer C comme exclu. |
5 | Optional dependencies Toute dépendance transitive peut être marquée comme facultative à l'aide de l'élément "facultatif". Par exemple, A dépend de B et B dépend de C. Maintenant B marqué C comme facultatif. Alors A n'utilisera pas C. |
Portée de la dépendance
La découverte des dépendances transitives peut être restreinte à l'aide de diverses étendues de dépendance, comme indiqué ci-dessous.
Sr.No. | Portée et description |
---|---|
1 | compile Cette portée indique que la dépendance est disponible dans le chemin de classe du projet. C'est la portée par défaut. |
2 | provided Cette portée indique que la dépendance doit être fournie par JDK ou Web-Server / Container lors de l'exécution. |
3 | runtime Cette portée indique que la dépendance n'est pas requise pour la compilation, mais est requise lors de l'exécution. |
4 | test Cette portée indique que la dépendance n'est disponible que pour les phases de compilation et d'exécution du test. |
5 | system Cette étendue indique que vous devez fournir le chemin du système. |
6 | import Cette portée n'est utilisée que lorsque la dépendance est de type pom. Cette portée indique que le POM spécifié doit être remplacé par les dépendances dans la section <dependencyManagement> de ce POM. |
Gestion des dépendances
Habituellement, nous avons un ensemble de projets dans le cadre d'un projet commun. Dans ce cas, nous pouvons créer un pom commun ayant toutes les dépendances communes puis faire de ce pom le parent des poms du sous-projet. L'exemple suivant vous aidera à comprendre ce concept.
Voici le détail du graphique de dépendances ci-dessus -
- App-UI-WAR dépend de App-Core-lib et App-Data-lib.
- Root est le parent d'App-Core-lib et d'App-Data-lib.
- Root définit Lib1, lib2, Lib3 comme des dépendances dans sa section de dépendances.
App-UI-WAR
<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-lib
<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-lib
<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>
Root
<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>
Désormais, lorsque nous construirons le projet App-UI-WAR, Maven découvrira toutes les dépendances en parcourant le graphique de dépendances et en construisant l'application.
À partir de l'exemple ci-dessus, nous pouvons apprendre les concepts clés suivants -
Les dépendances communes peuvent être placées à un seul endroit en utilisant le concept de pom parent. Dépendances deApp-Data-lib et App-Core-libLes projets sont répertoriés dans Projet racine (voir le type d'empaquetage de Root. C'est POM).
Il n'est pas nécessaire de spécifier Lib1, lib2, Lib3 comme dépendance dans App-UI-WAR. Maven utilise leTransitive Dependency Mechanism pour gérer ces détails.