Как скрыть свойство в pom.xml?

Я хотел бы отменить логическое свойство, определенное в pom.xml.

Значение, учитывая свойство ${doSomething}, мне нужно передать <skip> плагину, где значение <skip> должно быть отрицанием ${doSomething}.

Если ${doSomething} - false, то я хочу пропустить. Если это правда, то я не хочу пропускать. Любые идеи?

Уточнение. Я не говорю об использовании отрицания свойства для активации профиля. Я просто хочу передать отрицание логического в плагин.

Ответ 1

Помимо активации профиля, Maven не имеет логической логики. Поэтому, если вы хотите отменить свойство, чтобы передать его плагину, вам нужно сделать это самостоятельно. Это немного неуклюжий, но вы можете использовать цель build-helper-maven-plugin:bsh-property, которая позволяет написать BeanShell script и экспортируемые переменные, определенные в нем как свойства Maven:

<plugin>
  <groupId>org.codehaus.mojo</groupId>
  <artifactId>build-helper-maven-plugin</artifactId>
  <version>1.12</version>
  <executions>
    <execution>
      <id>negate-prop</id>
      <phase>initialize</phase>
      <goals>
        <goal>bsh-property</goal>
      </goals>
      <configuration>
        <source>dontDoSomething = !${doSomething};</source>
        <properties>
          <property>dontDoSomething</property>
        </properties>
      </configuration>
    </execution>
  </executions>
</plugin>

Вы не можете переопределить свойство, но вы можете определить новый, содержащий результат отрицания; в приведенном выше примере это dontDoSomething. Это выполняется в фазе initialize, так что остальные плагины могут использовать ее в качестве параметра со стандартным ${dontDoSomething}.

Это может быть расширено, чтобы иметь значение по умолчанию для dontDoSomething, если doSomething не существует.

<source>
  value = project.getProperties().getProperty("doSomething");
  dontDoSomething = value == null ? false : !Boolean.parseBoolean(value);
</source>

BeanShell - это язык сценариев, который очень похож на Java, и вы можете использовать существующие методы Java. В приведенном выше примере свойство "doSomething" извлекается из свойств проекта (project вводится плагином во время оценки с текущим проектом Maven); он не определен, мы возвращаем false, в противном случае мы отрицаем значение.


Если doSomething является, в частности, системным свойством, также возможно (ab) использовать функцию активации профиля и иметь 2 профиля: один активируется с помощью свойства true и устанавливает другое значение false, а второй профиль делает обратный:

<profiles>
  <profile>
    <id>pro-1</id>
    <activation>
      <property>
        <name>doSomething</name>
        <value>!false</value>
      </property>
    </activation>
    <properties>
      <dontDoSomething>false</dontDoSomething>
    </properties>
  </profile>
  <profile>
    <id>pro-2</id>
    <activation>
      <property>
        <name>doSomething</name>
        <value>false</value>
      </property>
    </activation>
    <properties>
      <dontDoSomething>true</dontDoSomething>
    </properties>
  </profile>
</profiles>

Это не будет работать, если doSomething - это свойство Maven, установленное в теге <properties>, например. Он должен быть передан как системное свойство с mvn -DdoSomething=true|false. Соответствующий профиль будет активирован в соответствии со значением системного свойства, которое будет определять свойство dontDoSomething его обратное. Если свойство не определено, будет активен pro-1, установив dontDoSomething на значение по умолчанию false. Все это довольно уродливо, хотя...

Ответ 2

Я не знаю точного ответа, но я думаю, что вы можете попробовать следующее инвертировать значение свойств (из http://maven.apache.org/guides/introduction/introduction-to-profiles.html), Объявите другое свойство, в котором вы инвертируете значение первого свойства:

<property>
    <name>dontDoSomething</name>
    <value>!${doSomething}</value>
</property>

Ответ 3

В Maven 3.5 это похоже на работу

<skip>${doSomething} == false</skip>