Как лучше всего обновить версию модулей в многомодульном проекте Maven

Дано: многомодульный проект Maven

Задача: обновлять версию после каждого релиза

Я вижу 2 разные стратегии:

Стратегия 1 — во время обновления: обновлять версии всех модулей вне зависимости от того, были обновления или нет.

Стратегия 2 — минимальное обновление: обновить только те версии тех модулей, которые действительно были затронуты.

Предположим, что у нас есть следующая структура проекта:

root
---dao
---domain
---web
   ---site1
   ---site2
---processors
    ---processor1
        ---processor1Service
        ---processor1Util
        ---processor1Tests
    ---processor2
        ---processor2Service
        ---processor2Util
        ---processor2Tests
---simulators
    ---simulator1
        ---simulator1Service
        ---simulator1Util
        ---simulator1Tests
    ---simulator2
        ---simulator2Service
        ---simulator2Util
        ---simulator2Tests
---etc

все родительские помпоны имеют тип упаковки - пом. Все конечные модули имеют тип производства ресурсов - jar, war, sar и т. д. Корневой pom содержит раздел dependencyManagement, в котором перечислены все дочерние модули.


стратегия 1:

  • релиз-менеджер RM (или кто-то еще) объединяет обновления из ветки (ов) «feature»
  • происходят все процессы непрерывной интеграции (пусть все в порядке)
  • RM вызывает mvn release:versionUpdate -DsetVersion=1.2 в корне
  • Выполнено

стратегия 2:

  • RM объединяет обновления из ветки (ов) «feature»

  • происходят все процессы непрерывной интеграции (пусть все в порядке)

  • RM проверяет модули, которые действительно были затронуты, с помощью инструментов Subversion (git, svn и т. д.)
  • RM увеличивает версию затронутых модулей вручную
  • Выполнено

стратегия 1:

Преимущества:

  1. нет ручного ввода от человека (может быть, кроме номера версии)
  2. Конфигурация pom тривиальна и едина, может обрабатываться только на корневом pom с использованием раздела dependencyManagement
  3. единая версия всех модулей в результате нет зоопарка версий модулей
  4. не нужно зависеть от внешних инструментов, которые должны проверять, где были актуальные обновления (или, что еще хуже, зависеть от внимательности RM)
  5. разработчики не ограничены в внесении каких-либо изменений, не связанных с их модулем (например, не нужно бояться, если вы добавите новую строку или случайно запустите инструмент автоматического форматирования в IDE)

недостатки:

  1. будут обновлены версии модулей, которые на самом деле не были затронуты - в результате возможна проблема с местом на HDD

стратегия 2:

Преимущества:

  1. будут обновлены версии модулей, которые были фактически обновлены

недостатки:

  1. зоопарк версии. dao_1.2 зависит от domain_1.52, оба зависят от модуля etc_1.639
  2. ручной ввод
  3. зависимость от внешних инструментов, которые должны проверять актуальные обновления

Пожалуйста, поделитесь своим мнением. Как эта проблема решается в крупных проектах, таких как, например. пружинный каркас


person Dmitrii Borovoi    schedule 08.02.2015    source источник


Ответы (1)


Лично я полностью пойду за вашей стратегией 1. Это стратегия, используемая в компании, в которой я работаю. Ваш побочный эффект, который вы упоминаете как место на жестком диске или обновление версий модуля, которые не требуется обновлять, является незначительными проблемами по сравнению с «версиями зоопарка».

Только я буду голосовать за вашу стратегию номер 2 в тех случаях, когда вы используете архитектуру OSGI, а это требует очень точной стратегии управления версиями модуля, и если вы обновите всю версию сразу, это разрушит большое преимущество OSGI (горячее развертывание только модули/подмодули, которые требуют обновления).

Я также предлагаю вам взглянуть на http://java.dzone.com/articles/why-i-never-use-maven-release, который дает хорошие советы, как обновить версию в многомодульном проекте maven, а также как отслеживать в любом CVS

person Antonio Maria Sanchez Berrocal    schedule 08.02.2015
comment
Спасибо за ответ. Не могли бы вы сказать мне примерное количество модулей в вашем проекте (проектах) для целей статистики. Вы пытались использовать стратегию 2 и разочаровались в ней, или вы все время используете № 1? - person Dmitrii Borovoi; 08.02.2015
comment
Ну, на работе мы используем архитектуру OSGI, поэтому каждый jar/модуль предоставляет свою собственную версию из-за природы OSGI. Поэтому всякий раз, когда происходит обновление/исправление, для обновления не всего проекта требуется только развертываемый jar/модуль. Но по предыдущему опыту в среде J2EE мы обновляем все развертываемые/jar-модули одновременно. Вы должны выбрать стратегию в зависимости от вашего развертываемого модуля. В OSGI развертываемым модулем является jar, поэтому вам следует использовать уникальную версию для каждого модуля. В среде J2ee, потому что развертываемая единица — это война. Она не против обновить все зависимости за один раз. - person Antonio Maria Sanchez Berrocal; 08.02.2015