Обновление номеров версий модулей в многомодульном проекте Maven

325

У меня есть мультимодульный проект Maven. Мы намерены сделать все эти модули вместе. Но на данный момент я заканчиваю жестко запрограммированную версию в каждом модуле pom.xml, как показано ниже

<parent>
    <artifactId>xyz-application</artifactId>
    <groupId>com.xyz</groupId>
    <version>2.50.0.g</version>
</parent>
<modelVersion>4.0.0</modelVersion>
<groupId>com.xyz</groupId>
<artifactId>xyz-Library</artifactId>
<version>2.50.0.g</version>

и основной родительский модуль имеет следующую конфигурацию

<modelVersion>4.0.0</modelVersion>
<groupId>com.xyz</groupId>
<artifactId>xyz-application</artifactId>
<version>2.50.0.g</version>
<packaging>pom</packaging>
sandeepkunkunuru
источник
1
Ваш вопрос искажен и сбивает с толку людей, которые имеют настоящие многомодульные («агрегатные») POM. Из вашего примера и ответов видно, что вы на самом деле говорите о родительском POM, а не многомодульном агрегированном POM. См. Maven.apache.org/pom.html#Aggregation .
Гаррет Уилсон

Ответы:

631

Используйте versions:setиз плагина version-maven :

mvn versions:set -DnewVersion=2.50.1-SNAPSHOT

Он настроит все версии pom, родительские версии и версии зависимостей в многомодульном проекте.

Если вы ошиблись, сделайте

mvn versions:revert

потом или

mvn versions:commit

если вы довольны результатами.


Примечание: в этом решении предполагается, что все модули используют агрегатный pom в качестве родительского pom, и этот сценарий считался стандартным во время этого ответа. Если это не так, обратитесь за ответом к Гаррету Уилсону .

Шон Патрик Флойд
источник
5
Было бы замечательно, если бы существовало решение, которое не требовало бы, чтобы вы фактически меняли каждый модуль. Единственная альтернатива, о которой я могу подумать, - это всегда использовать версию снимка для родительского ПОМа.
AmanicA
54
В дополнение к этому versions:setможно указать -DgenerateBackupPoms=false, так как по умолчанию этот плагин создает резервные копии оригинальных файлов POM.
Максим Сорокин
20
В этом суть versions:commit: «Удаляет начальную резервную копию POM, тем самым принимая изменения».
Майкл Лаффарг
2
Новый плагин решает проблему, описанную в этом вопросе по-другому: mojo.codehaus.org/flatten-maven-plugin/examples/…
Стефан
1
@MichaelLaffargue mvn версии: коммит, кажется, удаляет файлы резервных копий, сгенерированные из предыдущего pom.xml
Крис Роквелл,
58

Данный ответ предполагает, что рассматриваемый проект использует наследование проекта в дополнение к агрегации модулей. На самом деле это разные понятия:

https://maven.apache.org/guides/introduction/introduction-to-the-pom.html#Project_Inheritance_vs_Project_Aggregation

Некоторые проекты могут представлять собой совокупность модулей, но не иметь отношения родитель-потомок между агрегатором POM и агрегированными модулями. (Отношения между родителями и детьми могут вообще отсутствовать, или дочерние модули могут использовать отдельное POM в качестве «родителя».) В этих ситуациях данный ответ не будет работать.

После долгих чтений и экспериментов выясняется, что есть способ использовать плагин Versions Maven для обновления не только POM-агрегатора, но и всех агрегированных модулей; это processAllModulesвариант. Следующая команда должна быть выполнена в каталоге проекта агрегатора:

mvn versions:set -DnewVersion=2.50.1-SNAPSHOT -DprocessAllModules

Плагин Versions Maven не только обновит версии всех содержащихся в нем модулей, но также обновит межмодульные зависимости !!!! Это огромная победа, которая сэкономит много времени и предотвратит всевозможные проблемы.

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

mvn versions:commit -DprocessAllModules

Вы можете решить вообще отказаться от резервного копирования POMS и сделать все одной командой:

mvn versions:set -DnewVersion=2.50.1-SNAPSHOT -DprocessAllModules -DgenerateBackupPoms=false
Гаррет Уилсон
источник
Как нам автоматизировать следующую версию так же, как плагин build-helper?
lostintranslation
Используя Maven 3.5.0 я не могу заставить это работать. У меня агрегация проектов и только родительский pom обновился. Я также пробовал наследование проекта (вместе с агрегацией - «все три правила» из предоставленной ссылки), и снова обновлялся только родительский pom.
SiKing
1
Найден секретный переключатель make-it-work: начальная версия родительского pom и модулей должна быть одинаковой! Мой родительский pom начинался с «1-SNAPSHOT», а модули имели «1.0.0-SNAPSHOT». :)
SiKing
1
В проекте агрегатора версия агрегатора и версии подмодулей не обязательно должны совпадать. (Например, ваш агрегатор может меняться только редко и может оставаться в определенной версии, в то время как отдельные подмодули могут иметь свои собственные циклы выпуска). Ключевое свойство, которое нужно указать versions:setплагину -DoldVersion='*', на mojohaus.org/versions-maven-plugin/set-mojo.html явно указывает, что это свойство должно быть указано при обработке проекта агрегатора.
Мэтью Мудрый
2
При каких условиях на -DprocessAllModulesсамом деле работает? Это не работает для меня.
Алекс Р
24

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

mvn build-helper:parse-version versions:set -DnewVersion=\${parsedVersion.majorVersion}.\${parsedVersion.minorVersion}.\${parsedVersion.nextIncrementalVersion} versions:commit
Малкольм Крам
источник
3
Спасибо, @Crummy, вы спасли мой день
Максим Костромин
Или вы можете использовать-DoldVersion='*'
Мэтью Мудрый
23

Возможно, вы захотите взглянуть на релиз плагина Maven : цель update-version . Это обновит версию родителя, а также все модули под ним.


Обновление: обратите внимание, что выше плагин релиза. Если вы не выпускаете, вы можете использоватьversions:set

mvn versions:set -DnewVersion=1.2.3-SNAPSHOT
Nishant
источник
1
версия mvn: набор не влияет на модули.
9ilsdx 9rvj 0lo
ОК, это происходит, когда сборка реактора является одновременно родителем. Это сбивает с толку, когда структура выглядит иначе ...
9ilsdx 9rvj 0lo
mvn release:update-versions -DautoVersionSubmodulesработал нормально для меня, даже если я не выпускаю :-)
MSA
11

Я рекомендую вам прочитать Maven Book о многомодульных (реакторных) сборках.

Я имел в виду, в частности, следующее:

<parent>
    <artifactId>xyz-application</artifactId>
    <groupId>com.xyz</groupId>
    <version>2.50.0.g</version>
</parent>
<modelVersion>4.0.0</modelVersion>
<groupId>com.xyz</groupId>
<artifactId>xyz-Library</artifactId>
<version>2.50.0.g</version>

должен быть изменен на. Здесь позаботьтесь о не определенной версии, только в родительской части она определена.

<modelVersion>4.0.0</modelVersion>

<parent>
    <artifactId>xyz-application</artifactId>
    <groupId>com.xyz</groupId>
    <version>2.50.0.g</version>
</parent>
<groupId>com.xyz</groupId>
<artifactId>xyz-Library</artifactId>

Это лучшая ссылка .

khmarbaise
источник
10
а что конкретно искать?
Торбьерн Равн Андерсен
2
+1 за правильное форматирование pom.xmlфайлов, но я согласен (с @ ThorbjørnRavnAndersen), что чтение целой книги для этой информации излишне. : p
Прииду Неемре
7
К сожалению, наследование информации о версии от родителя не снимает бремени необходимости изменять все файлы pom в проекте - потому что все они ссылаются на родителя по номеру версии .
Стивен легко развлекается
1
Вы можете использовать version-maven-plugin, который обрабатывает все эти вещи, или вы можете использовать maven-release-plugin, и вам не нужно обрабатывать это вручную ...
khmarbaise
5

versions:update-child-modulesзвучит как то, что вы ищете. Вы можете сделать версии: установить, как упоминалось, но это упрощенный способ обновления номеров родительских версий. Для дочерних модулей, я считаю, что вы должны удалить <version>определения, так как они будут наследовать номер версии родительского модуля.

Джон Онстотт
источник
3

Лучший способ заключается в том, что, поскольку вы намереваетесь связать свои модули вместе, вы можете указать <dependencyManagement>тег во внешнем мосте pom.xml(родительский модуль) непосредственно под <project>тегом. Он контролирует версию и название группы. В вашем отдельном модуле вам просто нужно указать <artifactId>тег в вашем pom.xml. Он возьмет версию из родительского файла.

Мурали
источник
Я не могу найти тег dependencyManagement в pom.xml . Вы думаете о чем-то еще ?
ArturoTena
0

Самый простой способ - изменить версию в каждом файле pom.xml на произвольную версию. затем проверьте, что управление зависимостями использует правильную версию модуля, используемого в этом модуле! Например, если вы хотите увеличить версии для проекта буксирного модуля, вы должны сделать это следующим образом:

в детском модуле:

    <parent>
       <artifactId>A-application</artifactId>
       <groupId>com.A</groupId>
       <version>new-version</version>
    </parent>

и в родительском модуле:

<groupId>com.A</groupId>
<artifactId>A-application</artifactId>
<version>new-version</version>
Мойтаба Миракбари
источник
0

Чтобы обновить основной pom.xml и родительскую версию в подмодулях:

mvn versions:set -DnewVersion=1.3.0-SNAPSHOT -N versions:update-child-modules -DgenerateBackupPoms=false
angel.lopezrial
источник