Скажем, у меня есть многослойный проект Maven с двумя модулями и пятью листами.(На самом деле мой проект состоит из 14 модулей и 78 листов, но мой вопрос можно задать только с двумя.)
Родительский POM создает модули и использует dependencyManagement для определения сторонних зависимостей.
В POM модуля я использую dependencyManagement для объявления моих «внутренних» зависимостей (например, Module_A является «общим» и Module_A2 зависит от Module_A1 )
parent POM
| -- DependencyManagement
| -- 3rd party dependencies (e.g. commons-logging, junit)
|
+-+-- Module_A POM
| | -- DependencyManagement
| | -- Project inter-dependencies (Module_A1, Module_A2)
| |
| +---- Module_A1 POM
| +---- Module_A2 POM (depends on _A1)
| +---- Module_A3 POM (depends on _A1, _A2)
|
+-+-- Module_B POM
| -- DependencyManagement
| -- Project inter-dependencies (Module_A1, Module_B1)
|
+---- Module_B1 POM (depends on _A1)
+---- Module_B2 POM (depends on _A1, _B1)
Каждый лист ( Module_A1 .. Module_B2 ) объявляет свои зависимости без версии.Родительские зависимости объявляются весь путь вверх, и AFAICT - это чистая структура Maven, и все в основном работает как положено.
Я могу собрать Module_A без проблем из папки Module_A , и все работает.Он находит commons-logging , объявленный на родительском уровне POM, и A1 / A2 работают просто отлично.Так что синтаксически я в порядке.Но если я подхожу к родительскому POM и пытаюсь построить весь проект, я терплю неудачу с Module_A , жалуясь на dependencies.dependency.version для моих взаимозависимостей проекта.Точные, которые работали из папки Module_A , когда я вызывал Module_A / pom.xml напрямую, а не через родительский POM.Даже если я попытаюсь выполнить только Module_A / pom.xml из родительской папки через -pl Module_A , произойдет сбой.Таким образом, запуск Maven через родительский POM.xml разрыв файлов Module_A / POM.xml .
Это означает, что вы не можете использовать dependencyManagement на ДВУХ уровнях проекта, хотя я не могу найти ничего, что скажет мне не делать этого.В этом случае у меня есть два варианта:
A) Переместить внутренние взаимозависимости моего проекта до родительского POM.xml .Если я делаю это, мне кажется, что я полностью указываю ВСЕ мои зависимости вверху, и у меня будет загроможденное родительское POM, которое переопределяет мой проект.
B) Удалите dependencyManagement tag из Module_A и указать модули напрямую, но затем я включаю все объявленные модули в конечные POM ( Module_A1 и т. Д.), Что не то, что я хочу.(Я ЗНАЮ, ЧТО ЭТО ОДИН ПЛОХОЙ)
Я понимаю, что dependencyManagement - это на самом деле просто серия объявлений переменных, поэтому я, вероятно, ничего не сделаю, если перенесу свои внутренние зависимости в родительский POM,но это кажется неаккуратным.Как будто я не знал достаточно хорошо, чтобы аккуратно разделить зависимости моего модуля по подсистемам и вывести их всех на самый верхний POM.
Я знаю, что есть проекты, более сложные, чем мои.Все, что я вижу, это сотни зависимостей, сбрасываемых в родительский POM, создающих ужасный беспорядок.В моем случае я бы определил большинство из моих 78 конечных модулей в родительском POM, и это похоже на неправильный способ сделать это.Есть ли лучший способ или это намерение POM Parent?Чтобы указать все об окружающей среде и позволить всем нижним модулям определить как можно меньше?