Подтвердить что ты не робот

Как правильно настроить мультимодульный проект Maven с раздвижными циклами

Я пытаюсь разработать наилучший способ настройки нашего многомодульного проекта Apache Maven таким образом, который позволяет использовать разрозненные циклы выпуска модулей и не создает проблем с зависимостями при отладке проекта.

В настоящее время у нас есть настройка по строкам:

Зависимости, объявленные в модулях b и c, содержат минимальную версию, необходимую для компиляции модуля, что необязательно является текущей версией модуля или версией развертываемого модуля.

С точки зрения сборки это хорошо работает, каждый модуль может быть выпущен/обновлен по мере необходимости, однако при попытке отладки развернутого приложения в IntelliJ IDEA (версии 8 и 9 EAP), открывшего pom верхнего уровня, IDEA решает, что с мы объявили зависимость от [email protected], что при каждом входе в один из классов он должен открыть его из a-1.2-sources.jar, а не из текущих источников [email protected] в проекте. Это еще больше смущает тот факт, что переход в любой из классов b ведет нас к [email protected], а не к b1.3.

Моя первоначальная попытка обойти это заключалась в том, чтобы объявить номера версий в разделе родительского pom dependencyManagement и просто иметь подмодули, наследующие версию. Это помогло решить проблему отладки IDEA, так как раздел dependencyManagement может указывать всем на текущие версии -SNAPSHOT.

Это, к сожалению, вызывает проблему при выпуске maven из-за необходимости освободить родительский pom до выпуска модуля, но поскольку родитель может ссылаться на несколько in-development -SNAPSHOTS, он не может быть выпущен, и мы в итоге добавляем версия ссылается на модули pom, чтобы удовлетворить выпуск.

Казалось бы, использование раздела управления зависимостями maven будет действительно действительно хорошо работать, если бы мы выпускали ВСЕ пакеты одновременно, независимо от того, изменились ли они, но поскольку мы хотим управлять выпуском каждого дополнительного модуля только тогда, когда это необходимо модель, похоже, не подходит.

У меня есть подозрение, что у меня что-то не хватает, и что сочетание диапазонов dependencyManagement и версий может удовлетворить требования, хотя я еще не видел, чтобы диапазоны версий работали правильно.

Есть ли лучший способ? Правильный способ?

4b9b3361

Ответ 1

Окончательное/рабочее решение, которое мы закончили, было довольно похоже на то, с чего мы начали. Фактическая структура проекта остается неизменной:

Однако основные отличия заключаются в следующем:

  • родительский модуль не содержит каких-либо версий артефактов проекта.
  • отдельные модули полностью объявляют о зависимостях своих проектов и задают диапазон версий, то есть [1.0.0.1.1.0)
  • все модули запускают там число номеров циклов от .1, то есть 1.0.1-SNAPSHOT, это позволяет диапазон версий удовлетворять первоначальным моментальным снимкам (1.0.0-SNAPSHOT ранее 1.0.0 final, поэтому не включается).
  • дистрибутив pom (не изначально представленный под вопросом) определяет точную версию, которая будет развернута/включена в конкретную версию.
  • удалять все проекты -SNAPSHOTS из локального репозитория maven при выпуске, чтобы освободить только диапазоны отпускания (или использовать -Dmaven.repo.local =/tmp/sometemprepo для нового локального репо)

Это делает каждый модуль более автономным и дает нам свободу выпускать и развертывать новые версии наших артефактов проекта с минимальным шумом.

Ответ 2

Я бы рекомендовал не создавать их модули, но сделать их POM независимыми. Таким образом, вам не нужно беспокоиться о том, чтобы пытаться удовлетворить родительские POM-зависимости. Поскольку они выпускаются независимо, у них действительно должны быть независимые объектные модели проекта. Подумайте об Apache Commons как шаблоне.

Ответ 3

Я думаю, что проблема с IDEA возникает из-за того, что вы используете корневой POM в своей исходной структуре, чтобы сделать две вещи, которые обычно являются взаимоисключающими в Maven. Сначала вы используете POM в качестве места для хранения общей информации о конфигурации для несвязанных (с точки зрения сборки) проектов Maven. Во-вторых, вы используете POM в качестве агрегатора для своей сборки. Вы можете сделать каждый из них, не делая другого.

Как сказал Роб, удалите свои модули a, b и т.д. из раздела модулей вашего родительского POM. Во-вторых, переместите родительский POM в свой собственный каталог, поскольку он действительно является родным из других модулей в отношении процесса сборки и выпуска. Теперь у вас есть это, это скорее родительский/агрегатор.

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

Структура вашего файла будет выглядеть так:

  • родитель
    • pom.xml
  • модуль a
    • pom.xml
  • модуль X
    • pom.xml

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

Ответ 4

Они, безусловно, кажутся отдельными модулями. Какие преимущества вы получаете, разбивая их вместе, если они имеют разные зависимости, даже в рамках мультимодульного проекта?