如何理解价值!在maven个人档案中为false

时间:2016-09-22 06:44:17

标签: maven pom.xml maven-profiles

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

<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具有独特的意义?

1 个答案:

答案 0 :(得分:2)

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

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

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

  

当系统属性“debug”定义且值不是“true”时,将激活以下配置文件。

注意:粗体是我的。

由于super POM中定义的潜在默认属性不会继承此类属性名称(any),因此确实未定义,因此它不应与条件。但是,似乎!运算符在添加规则时起着重要作用,也就是在未指定属性时激活配置文件的情况(因此,未指定也意味着它没有提供值,匹配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;
        }
    }
}

问题是:未考虑定义的sysValue的{​​{1}}不动产值,在此特定情况下,它将为name。但是,对null的检查将返回equals,但是false的进一步检查会将其转为reverseValue,无论true是否存在属性并在这种情况下有效激活配置文件。

<强>更新
根据官方Maven JIRA报告的相关bug report,问题已得到澄清:这不是错误,而是错误的文档
因此,预期的行为确实是默认情况下使用这样的配置激活配置文件。