LINUX.ORG.RU

maven - версионирование мульти-модульных проектов

 , , ,


0

2

Здравствуй, ЛОР. Еще относительно недавно в нашей маленькой конторе частенько происходили эпические битвы по поводу вопроса версионирования мульти-модульных проектов в maven. В итоге, как я понял, каждый остался при своем мнении, а в репозитории сейчас в разных проектах версионирование происходит по разному.

Изначально все вообще было плохо, и во всех проектах всегда стояла одна и та же версия, которая никогда не менялась. Так было в первое время после перехода с ant на maven.

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

В других проектах каждый модуль имеет свою версию, записанную в pom.xml конкретного модуля. Однако, в такой ситуации при изменении версии одного модуля нужно во всех использующих его модулях вручную прописывать нужную версию, что частенько забывают либо не считают нужным делать, т.к. для этого надо просмотреть вручную каждый модуль. Частично здесь помогает versions plugin, однако не всегда.

Еще один вариант - все версии модулей прописаны лишь в одном месте - как property в корневом pom.xml. Вроде нормальный вариант, однако здесь получается что при изменении версии хотя бы одного модуля должна так же меняться версия корневого pom.xml, что тоже можно забыть/не_захотеть.

Так вот, хотелось бы найти какой-то универсальный способ, или услышать еще какие-нибудь варианты.

★★★★★

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

Можно указать диапазон версий для артефакта:

        <dependency>
            <groupId>some.group</groupId>
            <artifactId>some.name</artifactId>
            <version>[1.0.0,1.1.0)</version>
        </dependency>

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

            <version>[1.0.200,1.1.0)</version>
Тогда будут вытягиваться все версии, начиная с 1.0.200. При этом jar-файлы будут вытягиваться всегда последних версий Диапазон желательно не делать слишком большим, чтобы можно было как бы указывать версии артефактов с обратной совместимостью или без неё. Например, артефакты из диапазона 1.1.* не совместимы с диапазоном версий 1.0.*. Тогда нельзя указывать диапазон [1.0.0,2.0.0) чтобы не поломать совместимость.

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

Slavaz ★★★★★
()

dependencyManagement?

Последняя версия самая нормальная. Но обычно никто не парится и содержит одинаковою версию всех модулей и наращивает их вместе. Так проще пользователю, сложновато догадаться что module-data-0.2 и module-web-0.7 - это комбинация хорошо работающая вместе

vertexua ★★★★★
()
Ответ на: комментарий от vertexua

Но обычно никто не парится и содержит одинаковою версию всех модулей и наращивает их вместе.

Не всегда это срабатывает. Если несколько независимых команд, то только диапазоны помогают. Дабы не было «узкого горлышка бутылки» в виде версий в DependencyManagement.

Так проще пользователю, сложновато догадаться что module-data-0.2 и module-web-0.7 - это комбинация хорошо работающая вместе

достаточно немного исправить утверждение: «module-data-0.* и module-web-0.* - это комбинация хорошо работающая вместе»
и сразу разные команды разработчиков перестают толкаться локтями. :)

Slavaz ★★★★★
()
Ответ на: комментарий от Slavaz

«module-data-0.* и module-web-0.* - это комбинация хорошо работающая вместе»

Не уверен, учитывая что почти любой код плохо работает вместе, то скачки по минорным версиям нужно тестировать отдельно

vertexua ★★★★★
()

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

maxcom ★★★★★
()
Ответ на: комментарий от vertexua

Скачки по минорным версиям сглаживаются контрактами между артефактами. Например, добавили в artifact1 некую публичную фичу, описали её поведение - и кровь из носа, но в пределах диапазона версий эта фича должна оставаться неизменяемой. Можно её багфиксить, можно рефакторить, но ни в коем случае не менять существующее (дефолтное) поведение. Для нового поведения заводится новая фича, а не меняется старая (пусть даже новая фича дублирует старую на 99%). Например, переименовывание одного поля в JSON-ответе. Это должно быть новой фичей, Пишется где-нибудь TODO, что в API следующей версии нужно пересмотреть эту и другую похожую фичу и до смены диапазонов всё забывается. Смена диапазона версий - это фактически переход на API следующей версии. А там новый контракт по фичам и по поведению...

Slavaz ★★★★★
()
Ответ на: комментарий от maxcom

По хорошему думаю это надо на CI бы завернуть

Да, думаю это будет правильно. У нас CI сам наращивает и коммитит версию после успешной сборки. Плюс потом ещё оповещает Delivery Integration, но это уже другая песня :)

Slavaz ★★★★★
()
Ответ на: комментарий от Slavaz

Вариант с диапазонами версий еще не пробовали, надо будет проверить.

orm-i-auga ★★★★★
() автор топика
Ответ на: комментарий от vertexua

dependencyManagement?

Да, в некоторых проектах зависимости модулей сейчас прописаны именно так.

orm-i-auga ★★★★★
() автор топика
Ответ на: комментарий от maxcom

отдельную скриптовую обвязку

Я одно время примерно так обновлял зависимости на последние версии:

find -name "pom.xml" -exec mvn versions:use-latest-versions -Dincludes=foo.bar:foo.bar.some.group:* -f {} \;
Это конечно не гарантирует работоспособность после сборки, но по крайней мере быстрее чем править вручную.

orm-i-auga ★★★★★
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.