Пролет с Maven BOM

1. Общ преглед

В този бърз урок ще разгледаме как Maven, инструмент, основан на концепцията за обектния модел на проекта (POM), може да използва спецификация или „Спецификация на материалите“.

За повече подробности относно Maven можете да проверите нашата статия Apache Maven Tutorial.

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

За да разберем какво е спецификация и за какво можем да я използваме, първо трябва да научим основни понятия.

2.1. Какво е Maven POM?

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

2.2. Какво е Maven BOM?

BOM означава Bill of Materials. Спецификацията е специален вид POM, който се използва за управление на версиите на зависимостите на даден проект и осигурява централно място за дефиниране и актуализиране на тези версии.

BOM предоставя гъвкавостта за добавяне на зависимост към нашия модул, без да се притеснявате за версията, от която трябва да разчитаме.

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 артефакта. Artifact D 1.0 ще бъде използван при изграждането на A проект, тъй като пътят през E е по-кратък.

Има различни техники за определяне коя версия на артефактите трябва да бъде включена:

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

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

Просто казано, Управлението на зависимостите е механизъм за централизиране на информацията за зависимостите.

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

Следва пример за писане на спецификационен файл:

 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    

Както можем да видим, BOM е нормален POM файл със секция зависимостУправление, където можем да включим цялата информация и версии на артефакт.

2.5. Използване на BOM файла

Има 2 начина да използваме предишния BOM файл в нашия проект и тогава ще бъдем готови да декларираме зависимостите си, без да се притесняваме за номерата на версиите.

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

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

Както виждаме, нашият проект Test наследява Baeldung-BOM.

Също така можем да импортираме спецификацията.

При по-големите проекти подходът на наследяване не е ефективен, тъй като проектът може да наследи само един родител. Импортирането е алтернативата, тъй като можем да импортираме толкова спецификации, колкото ни е необходимо.

Нека да видим как можем да импортираме BOM файл в нашия проект POM:

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

2.6. Замяна на спецификацията на спецификацията

Редът на приоритет на версията на артефакта е:

  1. Версията на директната декларация на артефакта в нашия проект pom
  2. Версията на артефакта в родителския проект
  3. Версията в импортирания pom, като се вземе предвид реда на импортиране на файлове
  4. медиация на зависимост
  • Можем да презапишем версията на артефакта, като изрично дефинираме артефакта в пом на нашия проект с желаната версия
  • Ако един и същ артефакт е дефиниран с различни версии в 2 импортирани спецификации, тогава версията в BOM файла, който е деклариран първи, ще спечели

3. Пролетна спецификация

Може да открием, че библиотека на трети страни или друг проект на Spring, привлича преходна зависимост към по-стара версия. Ако забравим изрично да декларираме пряка зависимост, могат да възникнат неочаквани проблеми.

За да преодолее подобни проблеми, Maven подкрепя концепцията за зависимост от спецификацията.

Можем да импортираме spring-framework-bom в нашия раздел dependencyManagement, за да гарантираме, че всички Spring зависимости са в една и съща версия:

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

Не е необходимо да указваме атрибута версия , когато използваме артефакти Spring, както е в следния пример:

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

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

В тази бърза статия показахме концепцията на Maven Bill of Of-Material и как да централизираме информацията и версиите на артефакта в общ POM.

Най-просто казано, след това можем да го наследим или импортираме, за да се възползваме от предимствата на спецификацията.

Примерите за кодове в статията могат да бъдат намерени в GitHub.