Подтвердить что ты не робот

В 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

Он должен быть динамическим, потому что он используется как имя тега в нашем репозитории и всегда должен быть синхронизирован с версией артефакта.

Любые идеи о создании этих "динамических" свойств?

4b9b3361

Ответ 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 из бизнеса, вероятно, никогда не будет исправлена.