Весна с Maven BOM

Весна с Maven BOM

1. обзор

В этом кратком руководстве мы рассмотрим, как Maven, инструмент, основанный на концепции объектной модели проекта (POM), может использовать BOM или Bill Of Materials.

Подробнее о Maven читайте в нашей статьеApache Maven Tutorial.

2. Концепции управления зависимостями

Чтобы понять, что такое спецификация и для чего мы можем ее использовать, нам сначала необходимо изучить основные понятия.

2.1. Что такое Maven POM?

Maven POM - это XML-файл, который содержит информацию и конфигурации (о проекте), которые используются Maven для импорта зависимостей и создания проекта.

2.2. Что такое Maven BOM?

BOM расшифровывается как Bill Of Materials. 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.с

Спецификация обеспечивает гибкость для добавления зависимости в наш модуль, не беспокоясь о версии, от которой мы должны зависеть.

2.3. Переходные зависимости

Maven может обнаруживать библиотеки, которые необходимы нашим собственным зависимостям в нашихpom.xml, и автоматически их включает. Нет ограничений на количество уровней зависимостей, из которых собираются библиотеки.

Конфликт здесь возникает, когда 2 зависимости ссылаются на разные версии конкретного артефакта. Какой из них будет включен Maven?

Ответ здесь - «ближайшее определение». Это означает, что используемая версия будет ближайшей к нашему проекту в дереве зависимостей. Это называется посредничеством зависимости.

Давайте посмотрим на следующий пример, чтобы прояснить посредничество зависимостей:

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

Этот пример показывает, что проектA зависит отB, аE.B иE имеют свои собственные зависимости, которые встречаются с разными версиями артефактаD . АртефактD 1.0 будет использоваться при сборке проектаA, поскольку путь черезE короче.

Существуют разные методы определения версии артефактов:

  • Мы всегда можем гарантировать наличие версии, явно указав ее в POM нашего проекта. Например, чтобы гарантировать, что используетсяD 1.4, мы должны явно добавить его как зависимость в файлpom.xml.

  • Мы можем использовать разделDependency Management для управления версиями артефактов, как мы объясним позже в этой статье.

2.4. Управление зависимостями

Проще говоря, Dependency Management - это механизм для централизации информации о зависимостях.

Когда у нас есть набор проектов, которые наследуют общего родителя, мы можем поместить всю информацию о зависимостях в общий файл POM, называемый BOM.

Ниже приведен пример того, как написать файл спецификации:



    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
            
        
    

Как мы видим, BOM - это обычный файл POM с разделомdependencyManagement, куда мы можем включить всю информацию об артефакте и его версии.

2.5. Использование файла спецификации

Есть 2 способа использовать предыдущий файл спецификации в нашем проекте, и тогда мы будем готовы объявить наши зависимости, не беспокоясь о номерах версий.

Мы можем наследовать от родителя:


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

Как мы видим, наш проект Test наследует example-BOM.

Мы также можем импортировать спецификацию.

В более крупных проектах подход наследования неэффективен, поскольку проект может наследовать только одного родителя. Импорт является альтернативой, поскольку мы можем импортировать столько спецификаций, сколько нам нужно.

Давайте посмотрим, как мы можем импортировать файл спецификации в наш проект POM:


    4.0.0
    example
    Test
    0.0.1-SNAPSHOT
    pom
    Test

    
        
            
                example
                example-BOM
                0.0.1-SNAPSHOT
                pom
                import
            
        
    

2.6. Перезапись зависимости спецификации

Порядок приоритета версии артефакта:

  1. Версия прямого объявления артефакта в нашем проекте pom

  2. Версия артефакта в родительском проекте

  3. Версия в импортированном pom, с учетом порядка импорта файлов

  4. посредничество в зависимости

    • Мы можем перезаписать версию артефакта, явно указав артефакт в pom нашего проекта с желаемой версией.

    • Если один и тот же артефакт определен для разных версий в двух импортированных спецификациях, то победит версия в файле спецификации, объявленная первой.

3. Spring BOM

Мы можем обнаружить, что сторонняя библиотека или другой проект Spring переносит переходную зависимость к более старому выпуску. Если мы забудем явно объявить прямую зависимость, могут возникнуть непредвиденные проблемы.

Чтобы преодолеть такие проблемы, Maven поддерживает концепцию зависимости спецификации.

Мы можем импортироватьspring-framework-bom в наш разделdependencyManagement, чтобы гарантировать, что все зависимости Spring имеют одну и ту же версию:


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

Нам не нужно указывать атрибутversion, когда мы используем артефакты Spring, как в следующем примере:


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

4. Заключение

В этой быстрой статье мы показали концепцию Maven Bill-Of-Material и то, как централизовать информацию об артефакте и его версии в общей POM.

Проще говоря, мы можем либо наследовать, либо импортировать его, чтобы использовать преимущества спецификации.

Примеры кода в статье можно найтиover on GitHub.