В Maven, как я могу динамически построить значение свойства во время выполнения?
В maven очень легко установить свойства в pom со следующим синтаксисом:
...
<properties>
<myValue>4.06.17.6</myValue>
</properties>
...
Теперь мне нужно построить свойство, которое зависит от версии моего пом. Для создания свойства я хочу сделать следующее (java псевдо-код):
String[] parts = version.split("\\.");
String.format("V%s_%s_%s_P%s", splitted[0], splitted[1],splitted[2],splitted[3]);
// example: 4.06.17.6 => V_4_06_17_P6
Он должен быть динамическим, потому что он используется как имя тега в нашем репозитории и всегда должен быть синхронизирован с версией артефакта.
Любые идеи о создании этих "динамических" свойств?
Ответы
Ответ 1
Mojo Build-Helper Maven Plugin может помочь вам здесь.
Существует ряд целей, которые могут использоваться для преобразования свойств.
Существует
Вероятно, regex-property - тот, который вы хотите, но если ваши номера версий соответствуют "стандартам", остальные два могут вас спасти.
Чтобы использовать цель regex-property, вы бы сделали что-то вроде
<project>
...
<build>
<plugins>
<plugin>
<groupId>org.codehaus.mojo</groupId>
<artifactId>build-helper-maven-plugin</artifactId>
<version>1.7</version>
<executions>
<execution>
<id>regex-property</id>
<goals>
<goal>regex-property</goal>
</goals>
<configuration>
<name>tag.version</name>
<value>${project.version}</value>
<regex>^([0-9]+)\.([0-9]+)\.([0-9]+)\.([0-9]+)\.(-SNAPSHOT)?$</regex>
<replacement>V$1_$2_$3_P$4</replacement>
<failIfNoMatch>true</failIfNoMatch>
</configuration>
</execution>
</executions>
</plugin>
</plugins>
</build>
...
</project>
Примечание. Мое регулярное выражение может быть немного выключено, поэтому вы должны проверить выше.
Примечание. Значение свойства будет доступно только для выполнения после фазы, к которой это выполнение привязано. Фаза по умолчанию, на которую она привязана, равна validate
, но если вы находитесь на другом жизненном цикле (например, жизненном цикле сайта), значение будет недоступно.
Ответ 2
Вы можете использовать плагин maven build-helper, в частности его regex-property mojo. Взгляните на примеры использования (прокрутите до Установите свойство, применив замену регулярного выражения к разделу).
В принципе, вы хотите что-то подобное в своем pom, чтобы получить свойство myVersionTag
, которое выведено из myValue
:
<project>
...
<build>
<plugins>
<plugin>
<groupId>org.codehaus.mojo</groupId>
<artifactId>build-helper-maven-plugin</artifactId>
<version>1.7</version>
<executions>
<execution>
<id>regex-property</id>
<goals>
<goal>regex-property</goal>
</goals>
<configuration>
<name>myVersionTag</name>
<value>$\{myValue}</value>
<regex>(\d+)\.(\d+)\.(\d+)\.(\d+)</regex>
<replacement>V_$1_$2_$3_P$4</replacement>
</configuration>
</execution>
</executions>
</plugin>
</plugins>
</build>
...
</project>
Ответ 3
Ответ Игоря Кахарчиченко в основном правильный, за исключением того, что он копирует ошибку из документации Codehaus. Между "$" и "{" не должно быть "\". Моджо работает без него и не работает с ним. Воистину, с базовым пониманием регулярных выражений и Maven, я не мог видеть, что должна была делать обратная косая черта, и действительно ли это неправильно.
Стивен Коннолли отвечает правильно опускает обратную косую черту. Будьте осторожны.
Эта ошибка распространилась по всему SO и с Codehaus из бизнеса, вероятно, никогда не будет исправлена.