Printemps avec Maven BOM

1. Vue d'ensemble

Dans ce rapide tutoriel, nous allons voir comment Maven, un outil basé sur le concept de Project Object Model (POM), peut utiliser une nomenclature ou «Nomenclature».

Pour plus de détails sur Maven, vous pouvez consulter notre article Tutoriel Apache Maven.

2. Concepts de gestion des dépendances

Pour comprendre ce qu'est une nomenclature et à quoi nous pouvons l'utiliser, nous devons d'abord apprendre les concepts de base.

2.1. Qu'est-ce que Maven POM?

Maven POM est un fichier XML qui contient des informations et des configurations (sur le projet) utilisées par Maven pour importer les dépendances et pour construire le projet.

2.2. Qu'est-ce que Maven BOM?

BOM signifie nomenclature. Une nomenclature est un type spécial de POM utilisé pour contrôler les versions des dépendances d'un projet et fournir un emplacement central pour définir et mettre à jour ces versions.

BOM offre la flexibilité d'ajouter une dépendance à notre module sans se soucier de la version dont nous devrions dépendre.

2.3. Dépendances transitives

Maven peut découvrir les bibliothèques nécessaires à nos propres dépendances dans notre pom.xml et les inclut automatiquement. Il n'y a pas de limite au nombre de niveaux de dépendance à partir desquels les bibliothèques sont collectées.

Le conflit survient ici lorsque 2 dépendances font référence à différentes versions d'un artefact spécifique. Lequel sera inclus par Maven?

La réponse ici est la «définition la plus proche». Cela signifie que la version utilisée sera la plus proche de notre projet dans l'arborescence des dépendances. C'est ce qu'on appelle la médiation de dépendance.

Voyons l'exemple suivant pour clarifier la médiation de dépendance:

A -> B -> C -> D 1.4 and A -> E -> D 1.0

Cet exemple montre que le projet A dépend de B et E. B et E ont leurs propres dépendances qui rencontrent différentes versions de l' artefact D. Artifact D 1.0 sera utilisé dans la construction du projet A car le chemin à travers E est plus court.

Il existe différentes techniques pour déterminer quelle version des artefacts doit être incluse:

  • Nous pouvons toujours garantir une version en la déclarant explicitement dans le POM de notre projet. Par exemple, pour garantir que D 1.4 est utilisé, nous devons l'ajouter explicitement en tant que dépendance dans le fichier pom.xml .
  • Nous pouvons utiliser la section Gestion des dépendances pour contrôler les versions d'artefact, comme nous l'expliquerons plus loin dans cet article.

2.4. Gestion des dépendances

En termes simples, la gestion des dépendances est un mécanisme permettant de centraliser les informations de dépendance.

Lorsque nous avons un ensemble de projets qui héritent d'un parent commun, nous pouvons placer toutes les informations de dépendance dans un fichier POM partagé appelé BOM.

Voici un exemple d'écriture d'un fichier de nomenclature:

 4.0.0 baeldung Baeldung-BOM 0.0.1-SNAPSHOT pom BaelDung-BOM parent pom    test a 1.2   test b 1.0 compile   test c 1.0 compile    

Comme nous pouvons le voir, la nomenclature est un fichier POM normal avec une section dependencyManagement où nous pouvons inclure toutes les informations et versions d'un artefact.

2.5. Utilisation du fichier de nomenclature

Il existe 2 façons d'utiliser le fichier de nomenclature précédent dans notre projet, puis nous serons prêts à déclarer nos dépendances sans avoir à nous soucier des numéros de version.

On peut hériter du parent:

 4.0.0 baeldung Test 0.0.1-SNAPSHOT pom Test  baeldung Baeldung-BOM 0.0.1-SNAPSHOT  

Comme nous pouvons le voir, notre projet Test hérite du Baeldung-BOM.

Nous pouvons également importer la nomenclature.

Dans les grands projets, l'approche de l'héritage n'est pas efficace car le projet ne peut hériter que d'un seul parent. L'importation est l'alternative car nous pouvons importer autant de nomenclatures que nécessaire.

Voyons comment nous pouvons importer un fichier BOM dans notre projet POM:

 4.0.0 baeldung Test 0.0.1-SNAPSHOT pom Test    baeldung Baeldung-BOM 0.0.1-SNAPSHOT pom import    

2.6. Remplacement de la dépendance de nomenclature

L'ordre de priorité de la version de l'artefact est:

  1. La version de la déclaration directe de l'artefact dans notre projet pom
  2. La version de l'artefact dans le projet parent
  3. La version dans le pom importé, en tenant compte de l'ordre d'importation des fichiers
  4. médiation de dépendance
  • Nous pouvons écraser la version de l'artefact en définissant explicitement l'artefact dans le pom de notre projet avec la version souhaitée
  • Si le même artefact est défini avec des versions différentes dans 2 nomenclatures importées, alors la version du fichier de nomenclature qui a été déclarée en premier l'emportera

3. Nomenclature du ressort

Nous pouvons constater qu'une bibliothèque tierce, ou un autre projet Spring, extrait une dépendance transitive vers une version plus ancienne. Si nous oublions de déclarer explicitement une dépendance directe, des problèmes inattendus peuvent survenir.

Pour surmonter ces problèmes, Maven prend en charge le concept de dépendance de nomenclature.

Nous pouvons importer le spring-framework-bom dans notre section dependencyManagement pour nous assurer que toutes les dépendances Spring sont dans la même version:

   org.springframework spring-framework-bom 4.3.8.RELEASE pom import   

Nous n'avons pas besoin de spécifier l' attribut de version lorsque nous utilisons les artefacts Spring comme dans l'exemple suivant:

  org.springframework spring-context   org.springframework spring-web  

4. Conclusion

Dans cet article rapide, nous avons montré le concept Maven Bill-Of-Material et comment centraliser les informations et les versions de l'artefact dans un POM commun.

En termes simples, nous pouvons ensuite l'hériter ou l'importer pour profiter des avantages de la nomenclature.

Les exemples de code de l'article se trouvent à l'adresse over sur GitHub.