如果在apache中的isset蚂蚁失败了

时间:2013-06-08 10:43:44

标签: apache ant ant-contrib

我正在尝试使用以下内容检查ant中是否存在属性:

<target name="test">
    <property name="testproperty" value="1234567890"/>
    <if>
        <isset property="testproperty"/>
        <then>
            <echo message="testproperty exists"/>
        </then>
        <else>
            <echo message="testproperty does not exist"/>
        </else>
    </if>
</target>

结果是消息失败:

build.xml:536: Problem: failed to create task or type if
Cause: The name is undefined.
Action: Check the spelling.
Action: Check that any custom tasks/types have been declared.
Action: Check that any <presetdef>/<macrodef> declarations have taken place.

我必须对isset做错事,因为以下顺利运行:

<target name="test">
    <property name="testproperty" value="1234567890"/>
    <echo message="'${testproperty}'"/>
</target>

请建议:)

3 个答案:

答案 0 :(得分:9)

if任务不是标准的ANT任务。这就是目标的条件执行如何工作

<project name="demo" default="test">

  <target name="property-exists" if="testproperty">
    <echo message="testproperty exists"/>
  </target>

  <target name="property-no-exists" unless="testproperty">
    <echo message="testproperty does not exist"/>
  </target>

  <target name="test" depends="property-exists,property-no-exists">
  </target>

</project>

答案 1 :(得分:7)

显然我错过了可以在这里找到的ant-contrib jar文件:
http://ant-contrib.sourceforge.net/

答案 2 :(得分:3)

您找到了丢失的jar,现在您需要定义使用该jar的任务。我会把jar放在项目中的antlib/antcontrib目录下。这样,下载项目的其他人将拥有所需的jar。

<taskdef resource="net/sf/antcontrib/antlib.xml">
    <classpath>
        <fileset dir="${basedir}/antlib/antcontrib"/>
    </classpath>
</taskdef>

如果您使用大量可选的jar文件,则可能需要使用名称空间:

 <project name="..." basedir="."  default="...."
    xmlns:ac="antlib://net/sf/antcontrib">

    <taskdef resource="net/sf/antcontrib/antlib.xml"
         uri="antlib://net/sf/antcontrib">
        <classpath>
            <fileset dir="${basedir}/antlib/antcontrib"/>
        </classpath>
    </taskdef>

现在,当您使用antcontrib任务时,您必须在其前面添加ac:。这允许在没有命名空间冲突的情况下使用可选的jar。

<target name="test">
    <property name="testproperty" value="1234567890"/>
    <ac:if>
        <isset property="testproperty"/>
        <then>
            <echo message="testproperty exists"/>
        </then>
        <else>
            <echo message="testproperty does not exist"/>
        </else>
    </ac:if>
</target>