Java Ant条件属性扩展未按预期工作
因此,我在ant中进行了以下设置:Java Ant条件属性扩展未按预期工作,java,ant,conditional,target,Java,Ant,Conditional,Target,因此,我在ant中进行了以下设置: <target name="context"> <echo>docbase: ${docbase.dir}</echo> <antcall target="_context.docbase"/> <antcall target="_context.nodocbase"/> </target> <target name="_context.docbase" i
<target name="context">
<echo>docbase: ${docbase.dir}</echo>
<antcall target="_context.docbase"/>
<antcall target="_context.nodocbase"/>
</target>
<target name="_context.docbase" if="${docbase.dir}">
<echo>Context with docbase</echo>
<context.md docbase="..."/>
</target>
<target name="_context.nodocbase" unless="${docbase.dir}">
<echo>Context without docbase</echo>
<context.md/>
</target>
docbase:${docbase.dir}
具有docbase的上下文
没有docbase的上下文
当docbase.dir
设置为true或false时,事情会如您所期望的那样工作。但是当docbase.dir
由于某种原因被设置为实际值(例如/tmp/docbase
)时,它会命中\u context.nodocbase
目标,而不是预期的\u context.docbase
目标
阅读文档意味着,如果扩展属性不是“false”常量的“truthy”之一,那么它将像以前一样解释它,但这不是我看到的
我做错了什么?我应该使用不同的方法吗
注意:我使用的是Ant 1.8.2(条件参数扩展从1.8.0开始)。如下所述:
从Ant 1.8.0开始,您可以改为使用property expansion;值true(或on或yes)将启用该项,而false(或off或no)将禁用该项。其他值仍假定为属性名称,因此仅当定义了命名属性时才启用该项
这是一些非常微妙的信息。因此,代码中的内容是${docbase.dir}
扩展为“/tmp/docbase”。这不是真的/on/yes/false/off/no,所以Ant会查找名为“/tmp/docbase”的属性。它找不到它,因此它运行,除非
这里有一个例子,我希望能澄清一些事情。如果目标:
<project name="MyProject" default="context" basedir=".">
<target name="context">
<echo>docbase: ${docbase.dir}</echo>
<property name="/tmp/docbase" value="i exist!"/>
<antcall target="_context.docbase"/>
<antcall target="_context.nodocbase"/>
</target>
<target name="_context.docbase" if="${docbase.dir}">
<echo>Context with docbase</echo>
</target>
<target name="_context.nodocbase" unless="${docbase.dir}">
<echo>Context without docbase</echo>
</target>
</project>
docbase:${docbase.dir}
具有docbase的上下文
没有docbase的上下文
这里最重要的是这句话:
<property name="/tmp/docbase" value="i exist!"/>
由于该属性已定义,因此它将运行
if
,而不是,除非 你使用的是什么版本的ant?很好,我添加了一条注释。谢谢你解释了其中的微妙之处,但我不认为这有什么好处。很明显,我的'docbase.dir'是参数化的,所以你是说我需要用我的参数值的名称创建一个新属性,但我需要有条件地这样做,所以我回到了原点。我没有提出解决方案,我只是提供证据来支持我所说的,并举例说明问题。@rjcarr事实上,如果你不想用的方式,你就不能用if
或。它接受“true/on/yes/false/off/no/或声明参数的名称”。这些是您唯一的选择。@RJCAR但是如果您想要一个不同的解决方案,您可以使用这个:好的,再次感谢您的解释,并说明为什么它不能像我尝试的那样工作。