Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/ant/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Ant条件属性扩展未按预期工作_Java_Ant_Conditional_Target - Fatal编程技术网

Java 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

因此,我在ant中进行了以下设置:

<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但是如果您想要一个不同的解决方案,您可以使用这个:好的,再次感谢您的解释,并说明为什么它不能像我尝试的那样工作。