如何否定pom.xml中的属性?

Gil*_*ili 12 maven

我想否定pom.xml中定义的布尔属性.

意思是,给定一个属性${doSomething}我需要传递<skip>给一个插件,其中值<skip>应该是否定的${doSomething}.

如果${doSomething}是假,那么我想跳过.如果是真的,那么我不想跳过.有任何想法吗?

澄清:我不是在谈论使用否定属性进行配置文件激活.我只是想将布尔值的否定传递给插件.

Tun*_*aki 14

除了配置文件激活,Maven没有实现布尔逻辑.因此,如果想要否定属性将其传递给插件,则需要自己完成.它有点笨拙,但您可以使用build-helper-maven-plugin:bsh-property目标,它可以编写BeanShell脚本并将其中定义的变量导出为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>
Run Code Online (Sandbox Code Playgroud)

您不能覆盖该属性,但您可以定义一个包含否定结果的新属性; 在上面的例子中,它是dontDoSomething.这是在initialize阶段中运行,以便其余插件可以将其用作标准参数${dontDoSomething}.

这可以增强为具有dontDoSomethingif doSomething不存在的默认值.

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

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>
Run Code Online (Sandbox Code Playgroud)

例如,如果doSomething<properties>标记中设置了Maven属性,则无效.它需要作为系统属性传递mvn -DdoSomething=true|false.将根据系统属性的值激活相应的配置文件,该属性将dontDoSomething属性定义为其反转.如果未定义属性,pro-1则将处于活动状态,设置dontDoSomething为默认值false.所有这一切都很难看,但......