Проблема Maven с ManageDependencies в многоуровневых проектах - PullRequest
2 голосов
/ 17 марта 2019

Скажем, у меня есть многослойный проект 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?Чтобы указать все об окружающей среде и позволить всем нижним модулям определить как можно меньше?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...