Ответ 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
. Все это довольно уродливо, хотя...