Как определить и установить отсутствующее свойство среды в Maven?

#maven #environment-variables

#maven #переменные среды

Вопрос:

У меня есть настройка сборки, так что я передаю свою переменную через командную строку:

 mvn clean install -DsomeVariable=data
  

В моем pom у меня есть:

 <someTag>${someVariable}</someTag>
  

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

Можно ли это сделать в Maven?

Ответ №1:

Вы можете указать значение свойства по умолчанию в properties разделе вашего файла POM:

 <properties>
  <someVariable>myVariable</someVariable>
</properties>
  

Если вы хотите убедиться, что значение свойства ВСЕГДА указывается в командной строке, вы можете использовать maven-enforcer-plugin.

Вот ссылка, которая показывает, как обеспечить наличие системного свойства -> http://maven.apache.org/enforcer/enforcer-rules/requireProperty.html

Я просто скопирую XML дословно здесь на случай, если приведенная выше ссылка выйдет из строя.

 <project>
  [...]
  <build>
    <plugins>
      <plugin>
        <groupId>org.apache.maven.plugins</groupId>
        <artifactId>maven-enforcer-plugin</artifactId>
        <version>1.0.1</version>
        <executions>
          <execution>
            <id>enforce-property</id>
            <goals>
              <goal>enforce</goal>
            </goals>
            <configuration>
              <rules>
                <requireProperty>
                  <property>basedir</property>
                  <message>You must have a basedir!</message>
                  <regex>d</regex>
                  <regexMessage>You must have a digit in your baseDir!</regexMessage>
                </requireProperty>
                <requireProperty>
                  <property>project.version</property>
                  <message>"Project version must be specified."</message>
                  <regex>(d|-SNAPSHOT)$</regex>
                  <regexMessage>"Project version must end in a number or -SNAPSHOT."</regexMessage>
                </requireProperty>
              </rules>
              <fail>true</fail>
            </configuration>
          </execution>
        </executions>
      </plugin>
    </plugins>
  </build>
  [...]
</project>
  

Комментарии:

1. Спасибо за проницательный ответ, Алекс. Хотя я ищу свойство по умолчанию, а не применяю его. Поэтому, если оно не указано, скрипт будет использовать значение по умолчанию.

2. @TERACytE. Да, значение в properties разделе является значением по умолчанию, и вы всегда можете перезаписать его из командной строки.

Ответ №2:

Вы можете указать значение по умолчанию как

 <properties>
      <someTag>defaultValue</someTag>
</properties>
  

Когда вы запускаете команду maven, вы можете переопределить это значение следующим образом

 mvn clean package -DsomeTag=newSpecificValue
  

Комментарии:

1. Простое решение, которое мне нужно было использовать в сборке Дженкинса

Ответ №3:

Вместо этого вы можете использовать профили, но вам понадобится профиль для каждой переменной.

  <profile>
    <id>default-value-1</id>
    <activation>
          <activeByDefault>false</activeByDefault>
          <property>
             <name>!someVariable</name>
          </property>
    </activation>
    <properties>
        <someVariable>DEFAULT-VALUE</someVariable>
    </properties>
</profile>