如何理解 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;
}
}
}
问题是:未考虑定义的 name
的 sysValue
实际 属性 值,在这种特定情况下它将是 null
。但是,它对 equals
的检查将 return false
,但随后对 reverseValue
的进一步检查会将其变为 true
,而不管 name
属性 并在这种情况下有效激活配置文件。
更新
继相关 bug report 我在官方 Maven JIRA 上报告后,问题已经得到澄清:这不是一个错误,而是错误的文档。
因此,预期的行为确实是在默认情况下使用这种配置激活配置文件。
我在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;
}
}
}
问题是:未考虑定义的 name
的 sysValue
实际 属性 值,在这种特定情况下它将是 null
。但是,它对 equals
的检查将 return false
,但随后对 reverseValue
的进一步检查会将其变为 true
,而不管 name
属性 并在这种情况下有效激活配置文件。
更新
继相关 bug report 我在官方 Maven JIRA 上报告后,问题已经得到澄清:这不是一个错误,而是错误的文档。
因此,预期的行为确实是在默认情况下使用这种配置激活配置文件。