【问题标题】:if else condition in ant task produces errorif else条件在ant任务中产生错误
【发布时间】:2023-03-13 06:30:02
【问题描述】:

我有一个场景,我需要将目录从一个位置移动到另一个位置。如果目标文件夹中存在相同的目录,我需要将目录名称重命名为 oldname_1。 于是我写了一个sn-p如下:

<target name="Move">
    <IF>
        <available file="${output.dir}" type="dir" />
        <then>
            <echo message="Directory exists" />
            <rename src="${output.dir}" dest="${output.dir}_1"/>
            <property name="newdirectory" value="${dest}"/>
        </then>
    <ELSE>
        <echo message="Directory does not exist" />
    </ELSE>
    </IF>
        <move file="${newdirectory}" todir="C:\reports" />
    </target>

我得到的错误是:

问题:创建任务失败 原因:名称未定义。 行动:检查拼写。 行动:检查是否已声明任何自定义任务/类型。 行动:检查任何/声明已经发生。

【问题讨论】:

  • 您是否为ant-contrib 添加了必要的&lt;taskdef&gt;?请记住,Ant 没有内置的本地 if/else 构造。
  • 是的,我也试过了。出现另一个错误,提示“[taskdef] 无法从资源 net/sf/antcontrib/antcontrib.properties 加载定义。找不到。”

标签: ant build.xml ant-contrib


【解决方案1】:

正如Ian Roberts 已经提到的,您需要Ant-Contrib jar,然后设置&lt;taskdef/&gt; 指向这个jar。我强烈建议将其放入您的项目中并将其检入您的版本控制系统中。这样,当有人签出您的项目时,他们已经 安装了 Ant-Contib.jar

我的标准是将构建所需的所有可选jar(不是编译所需的jar)放在目录${basedir}/antlib中,然后将每个可选jar放在自己的目录中,所以我会将ant-contrib-1.0b3.jar放入${basedir}/antlib/antcontrib .

然后我这样定义任务:

<property name="antlib.dir"      value="${basedir}/antlib"/>

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

这样,如果您将 jar 文件更新为 Ant-Contrib jar 的新版本,您只需将其插入目录即可。您不必更新build.xml

还要注意我使用的是net/sf/antcontrib/antlib.xml 而不是net/sf/antcontrib/antcontrib.propertiesXML 文件是您应该 使用的。此说明在tasks page 上,与安装说明下main page 上的说明不同。原因是 XML 文件对 &lt;for&gt; 任务有正确的定义,而 properties 文件 没有。


但是,在 Ant 1.9.1 中还有另一种方法可以执行 ifunless,而不需要可选的 jar 文件。这些是新的If and Unless entity attributes

这些可以放在所有任务中,或者子实体中,通常可以替换 Ant-Contrib if/else 的东西:

<target name="move">
    <available file="${output.dir}" type="dir"
        property="output.dir.exists"/>
    <echo message"Directory exists"
        if:true="output.dir.exists"/>
    <move file="${output.dir}" tofile="${output.dir}_1"
        if:true="output.dir.exists"/>
    <property name="newdirectory" value="${dest}"
        if:true="output.dir.exists"/>
    <echo message="Directory does not exists"
        unless:true="output.dir.exists"/>
    <move file="${newdirectory}" todir="C:\reports" />
</target>

不像你的例子那么干净。但是,我会改为在目标名称上使用 if=unless= 参数:

<target name="move.test">
    <available file="${output.dir}" type="dir"
        property="output.dir.exists"/>
</target>

<target name="move"
    depends="move.test, move.exists, move.does.not exists">
    <move file="${newdirectory}" todir="C:\reports" />
</target>

<target name="move.exists"
    if="output.dir.exists">
    <echo message="Directory exists" />
    <move file="${output.dir}" tofile="${output.dir}_1"/>
    <property name="newdirectory" value="${dest}"/>
</move.exists/>

<target name="move.does.not.exists"
    unless="output.dir.exists"/>
    <echo message="Directory does not exist" />
</target>

如果你不回显所有内容,结构会更清晰:

<target name="move.test">
    <available file="${output.dir}" type="dir"
        property="output.dir.exists"/>
</target>

<target name="move"
    depends="move.test, backup">
    <move file="${newdirectory}" todir="C:\reports" />
</target>

<target name="backup"
    if="output.dir.exists">
    <move file="${output.dir}" tofile="${output.dir}_1"/>
    <property name="newdirectory" value="${dest}"/>
</move.exists/>

【讨论】:

    【解决方案2】:

    if/else 结构不是 Ant 的原生部分,它由 ant-contrib 项目提供,您需要下载一个 JAR 并将相关的 &lt;taskdef&gt; 添加到您的构建文件中。例如,如果你下载ant-contrib-1.0b3.jar并将它放在与你的build.xml相同的目录下名为build的目录中,那么你可以说

    <taskdef resource="net/sf/antcontrib/antcontrib.properties">
      <classpath>
        <pathelement location="build/ant-contrib-1.0b3.jar"/>
      </classpath>
    </taskdef>
    

    【讨论】:

      猜你喜欢
      • 2011-07-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-10-09
      • 2013-01-15
      • 2021-10-14
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多