如何理解 Maven 配置文件中的值 !false

how to understand the value !false in maven profile

我在maven.The下面的代码段中使用配置文件时遇到一个很奇怪的问题。

<profile>
        <id>update-jboss-as</id>
        <activation>
            <property>
                <name>release</name>
            </property>
        </activation>
        <modules>
            <module>ddd-djn</module> 
            <module>jboss-as</module>
        </modules>
    </profile>

我没有设置release属性,所以这个配置文件无法激活,模块不会执行,现在一切正常

但是当我添加一个代码行和代码段如下:

 <profile>
        <id>update-jboss-as</id>
        <activation>
            <property>
                <name>release</name>
                <value>!false</value>
            </property>
        </activation>
        <modules>
            <module>ddd-djn</module> 
            <module>jboss-as</module>
        </modules>
    </profile>

新增内容为<value>!false</value>

在我看来,配置文件也不会被激活。只有存在release属性才会被激活,它的值不是false,这里我没有设置release 属性 完全没有。奇怪的是,实际上这个配置文件被激活了。

问题:我不知道为什么会这样,也许值!false有独特的意义?

使用任何名称和值都可以重现此问题:

<profile>
    <id>test-profile</id>
    <activation>
        <property>
            <name>something</name>
            <value>!a</value>
        </property>
    </activation>
    ...
</profile>

默认情况下,上面的配置文件实际上是活动的。这与官方Maven profile documentation关于!true值的例子相矛盾:

The following profile will be activated when the system property "debug" is defined with a value which is not "true".

注:粗体是我的。

由于这样的 属性 名称(任何)不会被 super POM 中定义的潜在默认值 属性 继承,因此确实 未定义 因此它不应该符合条件。但是,似乎 ! 运算符在添加到规则中起着重要作用,在未指定 属性 时激活配置文件的情况也是如此(因此,未指定也意味着它没有提供值,匹配 value 条件,但确实稍微改变了 name 部分)。


如果该机制仍由 SystemPropertyProfileActivator 实现,已弃用但未记录它被哪个组件替换,如果已替换,则通过以下缩短代码确认错误:

ActivationProperty property = activation.getProperty();

if ( property != null ) {
    String name = property.getName();
    boolean reverseName = false;

    String sysValue = properties.getProperty( name );

    String propValue = property.getValue();
    if ( StringUtils.isNotEmpty( propValue ) ) {
        boolean reverseValue = false;
        if ( propValue.startsWith( "!" ) ) {
            reverseValue = true;
            propValue = propValue.substring( 1 );
        }

        // we have a value, so it has to match the system value...
        boolean result = propValue.equals( sysValue );

        if ( reverseValue ) {
            return !result;
        }
        else {
            return result;
        }
    }
}

问题是:未考虑定义的 namesysValue 实际 属性 值,在这种特定情况下它将是 null。但是,它对 equals 的检查将 return false,但随后对 reverseValue 的进一步检查会将其变为 true,而不管 name 属性 并在这种情况下有效激活配置文件。


更新
继相关 bug report 我在官方 Maven JIRA 上报告后,问题已经得到澄清:这不是一个错误,而是错误的文档
因此,预期的行为确实是在默认情况下使用这种配置激活配置文件。