Maven - включает все подмодули pom в качестве зависимостей в другом модуле

У нас есть модуль maven, который настроен так:

a (parent)
  -> b (submodule)
  -> c (submodule)
  -> d (submodule)

Этот список подмодулей будет расти с течением времени (к списку из 20 или около того). У нас есть еще один модуль, который будет включать в себя зависимости всех подмодулей a. Есть ли опрятный способ сделать это, вместо того, чтобы вручную синхронизировать список подмодулей с списком зависимостей. То есть есть ли какой-либо способ включения a и всех подмодулей в качестве зависимости?

Ответ 1

У вас есть несколько вариантов:

  • Без изменений. Перечислите все зависимости в каждом pom. Однако, если у них есть общий родитель, вы можете использовать dependencyManagement в родительском pom для установки версий для разных зависимостей. В детском помпе вам не нужно указывать версию. См. этот раздел из Maven по примеру. Недостатком этого подхода является то, что вам придется повторно переписывать одни и те же зависимости снова и снова.
  • Создайте родительский pom, в котором перечислены все общие зависимости. См. Пример здесь. Недостатком здесь является то, что вы ограничиваете все проекты, которые хотят воспользоваться этим, для использования родительского проекта, когда по какой-то причине им может понадобиться другой родительский проект.
  • Подождите, пока Maven mixins, который, как я слышал, был еще не готов.
  • Переосмыслите свой дизайн. Имеет ли смысл, чтобы проекты зависели от множества разных модулей и интерфейсов? Чтобы уменьшить coupling, вы можете создать один интерфейс, который могут использовать эти новые проекты. Несколько таких проектов, как Apache Axis2, с открытым исходным кодом, следуют этому шаблону. Один модуль содержит ваши 20 зависимостей и предоставляет интерфейс, который могут вызывать новые модули. Новые модули могут просто перечислить один основной модуль как зависимость, а все 20 зависимостей втянуты в транзитивные зависимости.

Я думаю, что выбор № 4, вероятно, прав, но я недостаточно знаком с вашей ситуацией.

Ответ 2

Относительно конструктивных соображений это легко сделать - просто включите <type>pom</type> в свою зависимость, указывая на родительскую пом. Например:

<dependency>
    <groupId>my.group.id</groupId>
    <artifactId>a</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <type>pom</type>
</dependency>

Ответ 3

Единственный способ, с помощью которого автоматически включаются зависимости, - это переходный механизм зависимостей, и он работает только за счет зависания зависимостей, поэтому, если у вас нет помпы, которая зависит от всех подмодулей, нет, вы не получите они без перечисления их всех. Необходимость сделать это указывает на недостаток вашего проекта. Если модули "все или нет", то они, вероятно, не являются отдельными модулями.