Оновлення номерів версій модулів у багатомодульному проекті 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>

1
Ваше запитання є помилковим і бентежить людей, які мають справжні мультимодульні ("сукупні") POM. З вашого прикладу та відповідей видно, що ви дійсно говорите про батьківську POM, а не про багатомодульний агрегат POM. Дивіться maven.apache.org/pom.html#Aggregation .
Гаррет Вілсон

Відповіді:


631

Використання versions:setз версій-Maven плагін :

mvn versions:set -DnewVersion=2.50.1-SNAPSHOT

Він буде коригувати всі пом-версії, батьківські версії та версії залежності в мультимодульному проекті.

Якщо ви помилилися, зробіть

mvn versions:revert

згодом, або

mvn versions:commit

якщо ви задоволені результатами.


Примітка: це рішення передбачає, що всі модулі також використовують сукупний pom як батьківський пом, сценарій, який вважався стандартним на момент відповіді. Якщо це не так, перейдіть до відповіді Гаррета Вілсона .


5
Було б чудово, якби було рішення, яке не вимагає від вас фактичної зміни кожного модуля. Єдина альтернатива, яку я можу придумати, - це завжди використовувати версію знімків для батьків-пом.
AmanicA

54
Додатково до versions:setодного можна вказати -DgenerateBackupPoms=false, так як за замовчуванням цей плагін створює резервні копії оригінальних файлів пам’яті.
Максим Сорокін

20
У цьому суть versions:commit: "Видаляє початкову резервну копію пом., Тим самим приймаючи зміни."
Майкл Лаффарг

2
Новий плагін вирішує проблему, описану в цьому питанні інакше: mojo.codehaus.org/flatten-maven-plugin/examples/…
Stephan

1
Версії @MichaelLaffargue mvn: начебто фільтр видаляє резервні файли, сформовані з попереднього pom.xml
Cris Rockwell

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?
програв переклад

Використовуючи Maven 3.5.0, я не можу змусити це працювати. У мене є агрегація проектів, і лише батьківський пом був оновлений. Я також спробував успадкування проектів (разом з агрегацією - "всі три правила" із наданого посилання), і знову лише оновлено батьківський пом.
Сікінг

1
Знайшов секретний перемикач make-it-work: стартова версія батьківського пом і модулів повинна бути однаковою! Мій батьківський пом починався з "1-SNAPSHOT", а в модулях було "1.0.0-SNAPSHOT". :)
SiKing

1
Для проекту агрегатора версія агрегатора та версії підмодулів не повинні бути однаковими. (Наприклад, помпон агрегатора може змінюватися лише рідко і може залишатися у певній версії, тоді як окремі підмодулі можуть мати власні цикли випуску). Ключове властивість, яке потрібно вказати versions:setплагіну -DoldVersion='*', на mojohaus.org/versions-maven-plugin/set-mojo.html чітко говорить, що це властивість слід вказати під час обробки проекту агрегатора.
Меттью Мудрий

2
За яких умов -DprocessAllModulesнасправді працює? Це не працює для мене.
Алекс R

24

Якщо ви хочете повністю автоматизувати процес (тобто ви хочете збільшити номер версії, не знаючи, що таке номер поточної версії), ви можете зробити це:

mvn build-helper:parse-version versions:set -DnewVersion=\${parsedVersion.majorVersion}.\${parsedVersion.minorVersion}.\${parsedVersion.nextIncrementalVersion} versions:commit

3
Дякую, @Crummy, ти врятував мій день
Максим Костромін


Або можете скористатися-DoldVersion='*'
Меттью Мудрий

23

Можливо, ви захочете ознайомитись із випуском плагіну Maven release: оновлення-версії мети. Він оновить батьківську версію, а також всі модулі, що знаходяться під нею.


Оновлення: Зверніть увагу, що вищевказаний плагін випуску. Якщо ви не випускаєте, можливо, захочете скористатисяversions:set

mvn versions:set -DnewVersion=1.2.3-SNAPSHOT

1
версія mvn: набір не впливає на модулі.
9ilsdx 9rvj 0lo


Гаразд це відбувається, коли збірка реактора знаходиться в одночасному батьківському. Це заплутано, коли структура виглядає інакше ...
9ilsdx 9rvj 0lo

mvn release:update-versions -DautoVersionSubmodulesдобре працював для мене, навіть якщо я не випускаю :-)
msa

11

Я закликаю вас прочитати книгу Maven про багатомодульні (реакторні) конструкції.

Я мав на увазі, зокрема, таке:

<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>

Це краща посилання .


10
і шукати, що конкретно?
Thorbjørn Ravn Andersen

2
+1 за створення належного форматування pom.xmlфайлів, але я згоден (з @ ThorbjørnRavnAndersen), що читати цілу книгу для цієї інформації буде надмірно. : p
Priidu Neemre

7
На жаль, успадковування інформації про версію від батьківського не знімає тягар необхідності змінювати всі пом-файли в проекті - тому що всі вони посилаються на батьківського номера за номером версії .
Стівен Легко забавлений

1
Ви можете використовувати версії-maven-плагін, які обробляють усі ці речі, або ви можете використовувати плагін maven-release-plugin, і тому вам не потрібно обробляти це вручну ...
khmarbaise

5

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


3

Найкращий спосіб - оскільки ви збираєтесь поєднати свої модулі разом, ви можете вказати <dependencyManagement>тег у самому зовнішньому pom.xml(батьківський модуль) прямо під <project>тегом. Він контролює назву версії та групи. У вашому індивідуальному модулі вам просто потрібно вказати <artifactId>тег у своєму pom.xml. Версія буде взята з батьківського файлу.


Я не можу знайти залежність тегуManagement на pom.xml . Ви думаєте над чимось іншим ?
ArturoTena

0

найпростіший спосіб - змінити версію в кожному pom.xml на довільну. потім перевірте це управління залежністю, щоб використовувати правильну версію модуля, що використовується в цьому модулі! наприклад, якщо ви хочете збільшити версію для проекту буксирування модуля, ви повинні робити течію:

в модулі childe:

    <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
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.