Как обновить / исправить родительскую версию одного дочернего модуля - PullRequest
0 голосов
/ 04 марта 2020

Структура

Я знаю, что эта структура проекта не "путь Maven", и именно поэтому я борюсь в первую очередь. К сожалению, я не могу изменить структуру проекта.

Я стараюсь максимально упростить его:

/module-a
/module-b
/module-c
/parent              <- <parent>master</parent>, <modules>module-a, module-b, module-c</modules>
/parent/aggregator-d <- <parent>parent</parent>, <modules>module-a, module-b</modules>
/parent/aggregator-t <- <parent>parent</parent>, <modules>module-a</modules>

Вариант использования

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

Это прекрасно работает (при использовании release:update-versions -DautoVersionSubmodules на родительском) для всех модулей, перечисленных в разделе <modules> в родительский POM (или активированный профиль). Однако остальные модули aggregator-d и aggregator-t не обновляются.

Неудачные попытки

Поэтому я решил обновить остальные модули отдельно, используя mvn --non-recursive, но пока безуспешно.

С плагином релиза мне удалось обновить только собственную версию, используя release:update-versions, однако это не обновляет указанную родительскую версию, поэтому в результате получается версия модуля, отличная от родительской версии (явное объявление версии модуля было добавлено плагином релиза):

<parent>
  [...]
  <version>1.0.0-SNAPSHOT</version>
</parent>
<version>1.0.0-changed-SNAPSHOT</version> <- added by release plugin

При использовании плагина версии , versions:set происходит сбой, поскольку версия модуля определяется его родителем, versions:update-parent не работает, потому что я не может указать новую родительскую версию (вместо этого будет установлена ​​самая новая версия, найденная в удаленном репозитории), и versions:update-child-modules говорит мне, что все дочерние модули обновлены (потому что идея состоит в том, чтобы запустить его на агрегатор, который ссылается на модуль Я хочу обновить).

Другие идеи

Команды Maven выполняются в декларативном конвейере Jenkins, поэтому, возможно, я мог бы попробовать (не рекомендуется) writeMavenPom .

Помимо этого и использования чего-то вроде sed или maven-antrun-plugin для замены регулярных выражений, у меня закончились идеи.

1 Ответ

0 голосов
/ 05 марта 2020

Читая больше документации по версиям плагина Maven, я заметил, что для параметра newVersion из versions:update-property он говорит:

Если вы хотите определить версию для использовать точно, вы должны использовать это так: -DnewVersion=[19.0] в противном случае будет использоваться более новая существующая версия.

Поэтому я применил эту информацию к параметру parentVersion из versions:update-parent вместе с -DallowSnapshots. Затем я получил это предупреждение (хотя сборка все еще была успешной):

[ПРЕДУПРЕЖДЕНИЕ] Не обновлять версию: не удалось разрешить ни одну версию

К счастью, я обнаружил, что желаемый версия не обязана существовать в удаленном хранилище, все в порядке, если она существует в локальном хранилище. Итак, что я сделал, чтобы наконец заставить все работать, просто mvn --non-recursive install родительский POM перед использованием versions:update-parent.

В общем, я делаю это сейчас (-N - это --non-recursive, ${v} разрешается в например, 1.0.0-changed-SNAPSHOT):

mvn -f parent release:update-versions -DautoVersionSubmodules -DdevelopmentVersion=${v}
mvn -f parent -N install
mvn -f parent/aggregator-d -N versions:update-parent -DallowSnapshots -DparentVersion=[${v}]
mvn -f parent/aggregator-t -N versions:update-parent -DallowSnapshots -DparentVersion=[${v}]

Это решение не очень красивое, но я предпочитаю его, используя регулярные выражения или устаревший API Jenkins.

...