Как я могу обновить свойство в 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.