在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
具有独特的意义?
答案 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,问题已得到澄清:这不是错误,而是错误的文档。
因此,预期的行为确实是默认情况下使用这样的配置激活配置文件。