Как я могу обновить свойство в Maven POM?
У меня есть два проекта Maven на верхнем уровне, backend
и frontend
, которые продвигают версии по собственному индивидуальному темпу. Поскольку каждый из них имеет несколько модулей, я определяю свои версии зависимостей в разделах dependencyManagement
в родительских/агрегированных POM и использую свойство для номера версии.
Я хочу чисто обновить свойство с номером версии на frontend
, желательно произвольно, но я могу жить с требованием соответствия текущей версии восходящего потока. Я пробовал использовать versions:update-property
, но эта цель кажется совершенно нефункциональной; независимо от того, существует ли фактически соответствующая версия восходящего потока, я получаю этот вывод отладки:
$ mvn versions:update-property -Dproperty=frontend.version -DnewVersion=0.13.2 -DautoLinkItems=false -X
...
[DEBUG] Searching for properties associated with builders
[DEBUG] Property ${frontend.version}
[DEBUG] Property ${frontend.version}: Looks like this property is not associated with any dependency...
[DEBUG] Property ${frontend.version}: Set of valid available versions is [0.9.0, 0.9.1, 0.9.2, 0.9.3, 0.9.4, 0.9.5, 0.10.0, 0.10.1, 0.11.0, 0.12.0, 0.13.0, 0.13.1, 0.13.2, 0.13.3]
[DEBUG] Property ${frontend.version}: Restricting results to 0.13.2
[DEBUG] Property ${frontend.version}: Current winner is: null
[DEBUG] Property ${frontend.version}: Searching reactor for a valid version...
[DEBUG] Property ${frontend.version}: Set of valid available versions from the reactor is []
[INFO] Property ${frontend.version}: Leaving unchanged as 0.13.1
[INFO] ------------------------------------------------------------------------
Я указал -DautoLinkItems=false
, и это, кажется, не имеет никакого эффекта; versions-maven-plugin
все еще сканирует все мои POM для соответствия зависимостей, подбрасывает руки и завершает работу. Я также попытался установить searchReactor
в false
для этого свойства в конфигурации плагина. Похоже, что плагин (1) неправильно сканирует зависимости, даже когда я явно сказал, что их игнорируют, и (2) даже фильтрует явно определенное соответствие.
Есть ли простой способ переписать запись свойства Maven на определенное значение, либо форсируя versions-maven-plugin
делать то, что я говорю, не проверяя номер версии или используя другую цель? Я бы предпочел избежать использования такого инструмента, как sed
, который не понимает XML (как я видел, рекомендуется в аналогичном вопросе), но я был бы в порядке с простой манипуляцией XPath.
Ответы
Ответ 1
Параметр newVersion плохо документирован (как и большинство из этого плагина). Проверяя интеграционные тесты, я вижу, что для него требуется диапазон версий Maven, а не простой номер версии. Кроме того, он не позволяет вам предоставлять какое-либо значение - он должен быть действительным, который может разрешить Maven. Параметр был бы лучше, если бы он назывался constrainRange
Для кого-либо еще в будущем попробуйте следующее:
mvn versions:update-property -Dproperty=frontend.version -DnewVersion=[0.13.2]
Если вам нужно обновить до моментального снимка, убедитесь, что для свойства allowSnapshots
установлено значение true
mvn versions:update-property -Dproperty=frontend.version -DnewVersion=[0.13.2] -DallowSnapshots=true
Ответ 2
Как обновить свойство в существующем POM:
Попробуйте использовать фильтрацию в maven-resource-plugin:
- указать версию в файле свойств;
- добавить настраиваемый фильтр с указанием пути к этому файлу (в дочернем pom.xml, где должна быть введена зависимость);
- обновить версию в файле свойств;
- выполнить сборку.
Преимущества:
- он должен работать;
- версия указана только один раз;
- файл свойств можно добавить под управлением версии;
- process-resources - один из первых шагов жизненного цикла maven.
Недостатки:
- ну, pom.xml все еще использует placeholder;
- дополнительная работа по автоматическому обновлению файла свойств из начальной сборки (слишком сложная, я полагаю, что должно быть упрощенное решение).
Как обеспечить правильное время сборки:
Вы можете указать любое свойство по параметру build.
Например, у меня есть свойство в моем pom.xml, например:
<properties>
<build.date>TODAY</build.date>
</properties>
Чтобы изменить его во время сборки, я просто использую параметр:
mvn compile -Dbuild.date=10.10.2010
Я уверен, что он будет работать и для версии. Кроме того, свойства из проектов верхнего уровня наследуются дочерними элементами.
Ответ 3
У меня была та же проблема и ничего не найдено, что изменяет свойства pom в файле.
В итоге я использовал sed, как вы предположили:
cat pom.xml | sed -e "s%<util.version>0.0.1-SNAPSHOT</util.version>%<util.version>$bamboo_planRepository_branch</util.version>%" > pom.xml.transformed;
rm pom.xml;
mv pom.xml.transformed pom.xml;
Ответ 4
Есть ли простой способ переписать запись свойства Maven на определенное значение
Начиная с версии 2.5
мы можем использовать set-property
(документация):
mvn versions:set-property -Dproperty=your.property -DnewVersion=arbitrary_value
Как указано, цель set-property
не выполняет никаких "проверок здравомыслия" по указанному вами значению, поэтому она всегда должна работать, но вы должны использовать ее с осторожностью.
Ответ 5
Когда вы определяете свое свойство в pom.xml, вы должны объявить его как интервал, если вы хотите, чтобы это свойство обновления работало.
Я имею в виду, что ваш frontend.version определяется следующим образом:
<frontend.version>0.13.1</frontend.version>
Затем плагин при установке -DnewVersion = 0.13.2 не распознает значение как действительное значение. Вместо этого, если вы определяете как интервал, плагин работает.
<frontend.version>[0.13.0,0.13.2]</frontend.version>
В одном из моих тестов я получаю следующий результат:
mvn versions:update-property -Dproperty=absis.version -DnewVersion=[2.20.4] -X
[DEBUG] Property ${test.version}: Set of valid available versions is [2.19.0-RC-REVISION-1, 2.19.0-RC0.1, 2.19.0-RC0.2, 2.19.0-RC0.3, 2.19.0-RC0.4, 2.19.0-RC0.5, 2.19.0-RC0.6, 2.19.0-RC0.7, 2.19.0-RC1, 2.19.0-RC2, 2.19.0-RC3, 2.19.0, 2.19.0-revision, 2.19.0-revision2, 2.19.0.2, 2.19.1, 2.19.2, 2.19.3, 2.19.4, 2.20.0-RC0, 2.20.0-RC0.1, 2.20.0-RC1, 2.20.0-RC2, 2.20.0-RC3, 2.20.0, 2.20.0-PRUEBA-VERSION, 2.20.0-PRUEBA-VERSION-2, 2.20.0-PRUEBA-VERSION-3, 2.20.0i-RC1, 2.20.0i-RC1.1, 2.20.0i, 2.20.0i.2, 2.20.1, 2.20.2, 2.20.4, 2.20.5, 2.20.5-LT, 2.20.5.1, 2.20.6i-RC1, 2.21.0-RCtest1, 2.21.0-RCtest2]
[DEBUG] Property ${test.version}: Restricting results to [2.20.4,2.20.4]
[DEBUG] Property ${test.version}: Current winner is: 2.20.4
[DEBUG] Property ${test.version}: Searching reactor for a valid version...
[DEBUG] Property ${test.version}: Set of valid available versions from the reactor is []
[INFO] Updated ${test.version} from [2.19.0,2.21.0-SNAPSHOT] to 2.20.4
Купить вам нужно изменить значение свойства в диапазоне.
Это позор, потому что я не могу использовать диапазон в определении моих попов.
Ответ 6
Применительно к версиям: цель update-properties. Я думаю, что то же самое относится и к версиям: update-property.
Цель по умолчанию работает только в том случае, если соответствующее определение свойства и объявление зависимости отображаются в одном файле POM.
Если, скажем, свойство определено в проекте POM, но используется в объявлении зависимости в модуле POM, тогда в проекте POM требуется следующая конфигурация для автоматического обновления через плагин версий.
<properties>
<my.version>3.7.11</my.version>
</properties>
...
<build>
<plugins>
<plugin>
<groupId>org.codehaus.mojo</groupId>
<artifactId>versions-maven-plugin</artifactId>
<version>2.2</version>
<configuration>
<properties>
<property>
<name>my.version</name>
<dependencies>
<dependency>
<groupId>com.acme.test</groupId>
<artifactId>demo-arti</artifactId>
</dependency>
</dependencies>
</property>
</properties>
</configuration>
</plugin>
</plugins>
</build>
Конфигурация плагина вступает в действие, когда плагин версии maven работает против POM и пытается обновить свойство. Конфигурация сообщает плагину Versions, что свойство будет использоваться для заявленной зависимости "в POM где-то", даже если не в настоящем POM.