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

Допустим, у нас есть 3-х слойный проект. БД, Бизнес, Веб и агрегатные пом.

Project  
|-DB  
| |-pom.xml  
|-Business  
| |-pom.xml  
|-pom.xml

Все модули должны быть выпущены и разветвлены вместе, поэтому модуль агрегатора настроен для назначения одной и той же версии всем подмодулям. У нас есть следующие версии:

DB-0.1-SNAPSHOT  
Business-0.1-SNAPSHOT which depends on DB-0.1-SNAPSHOT  
Web-0.1-SNAPSHOT which depends on Business-0.1-SNAPSHOT  

При выполнении release:prepare все версии обновляются до 0.1, но подготовка завершается неудачно, потому что DB-0.1 еще не находится в зависимости.

Одно из решений - создавать разные проекты для каждого модуля и выпускать их один за другим, используя плагин versions:use-releases для обновления зависимости до 0.1.

Но мне не нравится эта идея, потому что она требует большой настройки и написания сценариев. Итак, я предпочитаю использовать агрегацию и выпускать все модули одной командой, но проблема в том, как я писал выше, когда плагин выпуска пытается собрать Business-0.1, в репозитории еще нет DB-0.1.

Есть ли способ управлять этими зависимостями между проектами?

Спасибо.

UPD:

даже установить цель не удается.

  1. Сборка БД - ОК (ни снимка, ни версии выпуска нет ни в одном репозитории)
  2. Бизнес - Сбой (DB-0.1-SNAPSHOT не найден в репозитории. Но его там даже не должно быть!)

Я использую maven 3.0.2 и выпускаю плагин 2.1


comment
Вы указали Business и DB как модули родительского POM, верно? И вы запускаете релиз: готовьте только для родительского POM, верно? Функциональность, которую вы описываете, обычно работает "из коробки".   -  person Matthew Gilliard    schedule 02.03.2011
comment
Да, он работает, ЕСЛИ Бизнес зависит от какой-то более старой версии БД, которая уже находится в репозитории. Но если вы попытаетесь сослаться на новую версию, которая не может быть в репозитории, поскольку она еще даже не была создана, тогда нет, это не сработает ..   -  person Dima    schedule 02.03.2011
comment
Это не обязательно должно быть в репозитории - Maven сначала будет искать в своем реакторе (то есть в модулях, которые в настоящее время строятся).   -  person Matthew Gilliard    schedule 02.03.2011


Ответы (3)


ваш проект должен определять версию только в родительском (проекте) только один раз. И пусть все остальные модули имеют родительские отношения. Это означает, что у вас нет агрегации. Вместо этого у вас есть многомодульная сборка.

Project  
|-pom.xml (version 0.1-SNAPSHOT)
|-DB  
| |-pom.xml (parent: ..)
|-Business  
| |-pom.xml (parent:..)

Это решит вашу проблему (возможно, вы можете взять пример здесь).

person khmarbaise    schedule 02.03.2011
comment
Каждый модуль имеет ссылку на родительский «‹parent› ‹artifactId› parent-test ‹/artifactId› ‹groupId› com.lookin2.test ‹/groupId› ‹version› 0.0.14-SNAPSHOT ‹/version› ‹/parent›» И я настроил плагин выпуска, чтобы установить для каждого модуля родительскую версию. Проблема в том, что у Business есть зависимость от версии БД, которой еще нет в репозитории. Если я установлю эту зависимость для какой-то более старой версии, которая уже находится в репозитории, все будет работать нормально. У меня проблема только при попытке выпустить новую версию всего проекта. - person Dima; 02.03.2011
comment
С какой версией Maven вы работаете? Можете ли вы дать фрагменты pom, в частности, со ссылкой на зависимость БД? - person khmarbaise; 02.03.2011
comment
В этом ответе не рассматривается, как один модуль (например, Business) может зависеть от другого (например, DB) и автоматически обновлять эту зависимость в процессе выпуска. - person Caoilte; 05.03.2011
comment
Согласитесь, этот ответ вообще не отвечает на вопрос. - person Programming Guy; 29.06.2011
comment
@Dima Почему ты принял этот ответ? Возможно, вы сможете подробнее рассказать, как он решил вашу проблему? - person Duncan Jones; 06.06.2013
comment
Я бы сказал, что это правильный ответ, но объяснение могло бы быть более ясным. Если оставить версию только в родительском, зависимости будут обновлены до начала сборки подмодулей, что сделает Reaction обрабатывает зависимости, чтобы база данных была выпущена и построена раньше Business. - person Johan Tidén; 10.06.2014

Мне удалось это сделать с помощью Maven 3.3.9 ... но позвольте мне описать сценарий моего случая:

Я работаю с платформой Java под названием Liferay, где есть инструмент под названием Service Builder, который может создавать и развертывать службы с использованием Maven с точной структурой, как вы описали:

Service Layer
|-pom.xml (version 1.12.0-SNAPSHOT)
|-Service Portlet
| |-pom.xml (version 1.16.0-SNAPSHOT)<---   
|-Service                               | Artifact dependency
| |-pom.xml (version 1.5.0-SNAPSHOT)-----

Как видите, модуль приложения портлета построен с зависимостью службы, которая представляет собой файл .jar, который, помимо прочего, упаковывает интерфейсы для работы служб.

Кстати, я делал это со своим проектом, используя модули разных версий. Я нашел интересную статью об этой практике: Выпуск модулей многомодульного проекта с независимыми номерами версий. Вы можете прочитать аннотацию, чтобы сделать свои собственные выводы о том, подходят ли модули управления версиями или нет ... но с моей точки зрения, после прочтения требований Клиента, мне кажется разумным, что управление версиями модулей должно быть поддерживаемой функцией от Maven, не будучи слишком болезненным для реализации.

Запуск mvn release:prepare и mvn:perform внутри родительского (уровня сервиса) был правильным решением. Maven выполняет сборку и развертывание выпуска в следующем порядке: 1) родительский pom 2) зависимость службы 3) портлет службы.

Maven позаботился о порядке, и это хорошо ... но зависимость службы построена на основе исходного кода портлета с целью, выполняемой в родительском проекте: _4 _... поэтому на зависимость влияет исходный код приложения с портлетами (звучит немного безумно). В моем случае это было непросто.

Итак, как нам создать и развернуть зависимость службы, чтобы портлет службы мог ее использовать?

Что ж, решением для этого было использование конфигурации в maven-release-plugin, которая позволяет Maven выполнять определенные задачи на этапе release:perform в любом из проектов. Я добавил эту конфигурацию в объявление maven-release-plugin в родительском файле pom.xml (уровень обслуживания):

<plugin>
  <groupId>org.apache.maven.plugins</groupId>
  <artifactId>maven-release-plugin</artifactId>
  <version>2.5.2</version>
  <configuration>
   <goals>clean liferay:build-service deploy</goals>
  </configuration>
</plugin>

И Maven смог развернуть родительский и каждый из дочерних модулей с нашими предпочтительными номерами версий (вам будет предложено ввести их).

Обобщенный ответ и рекомендация: попробуйте использовать <goals> конфигурацию и запустите mvn release:prepare и mvn release:perform на родительском уровне

Родитель и модули должны быть развернуты в указанном порядке.

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

person evaldeslacasa    schedule 19.07.2016

Для многомодульного проекта, когда он не работает в зависимости от дочернего моментального снимка, попробуйте этот выпуск: чистый выпуск: подготовить выпуск: выполнить -DignoreSnapshots = true

Надеюсь, это поможет.

person Amrut Prabhu    schedule 21.04.2017