Printemps avec Maven BOM

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 une «nomenclature».

Pour plus de détails sur Maven, vous pouvez consulter notre articleApache Maven Tutorial.

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 contenant des informations et des configurations (relatives au projet) utilisées par Maven pour importer des dépendances et construire le projet.

2.2. Qu'est-ce que Maven BOM?

BOM est synonyme de nomenclature. A BOM is a special kind of POM that is used to control the versions of a project’s dependencies and provide a central place to define and update those versions.

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

2.3. Dépendances Transitives

Maven peut découvrir les bibliothèques nécessaires à nos propres dépendances dans nospom.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 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’arbre 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 projetA dépend deB etE.B etE ont leurs propres dépendances qui rencontrent différentes versions de l'artefactD . L'artefactD 1.0 sera utilisé dans la construction du projetA car le chemin à traversE 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 queD 1.4 est utilisé, nous devons l'ajouter explicitement en tant que dépendance dans le fichierpom.xml.

  • Nous pouvons utiliser la sectionDependency Management pour contrôler les versions d'artefacts comme nous l'expliquerons plus loin dans cet article.

2.4. Gestion de la dépendance

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

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 de comment écrire un fichier de nomenclature:



    4.0.0
    example
    example-BOM
    0.0.1-SNAPSHOT
    pom
    example-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 sectiondependencyManagement où nous pouvons inclure toutes les informations et versions d'un artefact.

2.5. Utilisation du fichier de nomenclature

Il existe deux manières d'utiliser le fichier de nomenclature précédent dans notre projet et nous serons alors prêts à déclarer nos dépendances sans avoir à vous soucier des numéros de version.

Nous pouvons hériter du parent:


    4.0.0
    example
    Test
    0.0.1-SNAPSHOT
    pom
    Test
    
        example
        example-BOM
        0.0.1-SNAPSHOT
    

Comme nous pouvons le voir, notre projet Test hérite de l'exemple-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 de nomenclature dans notre POM de projet:


    4.0.0
    example
    Test
    0.0.1-SNAPSHOT
    pom
    Test

    
        
            
                example
                example-BOM
                0.0.1-SNAPSHOT
                pom
                import
            
        
    

2.6. Remplacement de la dépendance de la 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 prenant en compte 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, la version déclarée en premier dans le fichier de nomenclature sera gagnante.

3. Nomenclature de printemps

Nous pouvons constater qu'une bibliothèque tierce, ou un autre projet Spring, crée une dépendance transitive par rapport à 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 soutient le concept de dépendance à la nomenclature.

Nous pouvons importer lesspring-framework-bom dans notre sectiondependencyManagement 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'attributversion 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 présenté 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 tirer parti des avantages de la nomenclature.

Les exemples de code dans l'article peuvent être trouvésover on GitHub.