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

Допустим, у нас есть 3 слоя проекта. БД, Бизнес, Веб и агрегирование пом.

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

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

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

Ответы [ 3 ]

4 голосов
/ 02 марта 2011

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

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

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

1 голос
/ 21 апреля 2017

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

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

0 голосов
/ 20 июля 2016

Мне удалось сделать это с помощью 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 внутри родительского (Service Layer) пути.Maven выполняет сборку и развертывание релиза в следующем порядке: 1) родительский pom 2) сервисная зависимость 3) сервисный портлет.

Maven позаботился о порядке, и это хорошо ... но сервисная зависимостьпостроен на основе исходного кода портлета с целью запуска в родительском проекте: mvn liferay:build-service ... поэтому на зависимость влияет исходный код приложения с портлетом (звучит немного странно).Это была сложная часть в моем случае.

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

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

<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 лет.

...