ant-contrib for loop任务失败

时间:2013-10-22 14:05:42

标签: ant ant-contrib

要在文件集中搜索多个字符串,我尝试使用ant-contrib for ..循环但没有成功。 documentation有以下简单示例

<project name="testing" default="main" basedir=".">

<taskdef resource="net/sf/antcontrib/antcontrib.properties">
  <classpath>
    <pathelement location="/usr/share/java/ant-contrib-0.3.jar"/>
  </classpath>
</taskdef>

<task name=main">
<echo message="The first five letters of the alphabet are:"/>
  <for list="a,b,c,d,e" param="letter">
    <sequential>
      <echo>Letter @{letter}</echo>
    </sequential>
  </for>
</task>

</project>

失败了

xTest.xml:12: Problem: failed to create task or type for
Cause: The name is undefined.

这有什么问题?

不确定我是否需要ant-contrib-0.3.jar的taskdef

注意:ANT在Eclipse中运行,版本为:“Apache ANT 1.8.2v20110505-1300”

2 个答案:

答案 0 :(得分:2)

您需要为ant-contrib-0.3.jar添加taskdef。 ant-contrib installation页面告诉您如何执行此操作:

<taskdef resource="net/sf/antcontrib/antlib.xml">
  <classpath>
    <pathelement location="/usr/share/java/lib/ant-contrib-version.jar"/>
  </classpath>
</taskdef>

这样做,我在build.xml中有以下定义:

<project name="sample" basedir=".">
  <taskdef resource="net/sf/antcontrib/antlib.xml">
    <classpath>
      <pathelement location="C:\\Users\\userdomains\\Downloads\\ant-contrib\\ant-contrib-1.0b3.jar"/>
    </classpath>
  </taskdef>

  <echo message="The first five letters of the alphabet are:"/>
  <for list="a,b,c,d,e" param="letter">
    <sequential>
      <echo>Letter @{letter}</echo>
    </sequential>
  </for>
</project>

现在应该给出:

Buildfile: c:\build.xml
     [echo] The first five letters of the alphabet are:
     [echo] Letter a
     [echo] Letter b
     [echo] Letter c
     [echo] Letter d
     [echo] Letter e

BUILD SUCCESSFUL
Total time: 0 seconds

答案 1 :(得分:0)

此基本示例也有效,第一次发布时需要

  

搜索文件集中的多个字符串

没有解决。这就是我现在所拥有的:                                   

<loadfile property="dtdNAMES"  srcFile="_dtdNAMES_1.txt"/>
<echo>.:${dtdNAMES}:.</echo>

<target name="main">
  <for list="xyz.name,xyz.version,xyz.general,xyz.generalXXX,xyz.ok" param="search4" delimiter=",">
  <!--for list="${dtdNames}" param="search4" delimiter=","-->

      <!-- do the stuff here with param -->
      <sequential>

        <fileset id="existing" dir="../src">
            <patternset id="files">
              <include name="content/**/*.xul"/>
            </patternset>
        </fileset>

        <resourcecount property="count">
            <fileset id="matches" dir="../src">
              <patternset refid="files" />
              <contains text="@{search4}" />
            </fileset>
        </resourcecount>

        <echo message="Found '@{search4}' in files : '${count}'"/>
      </sequential>

  </for>
</target>

这有 2个问题

广告1。使用&lt; for list =“.. csv ..”只输出包含所有文件的列表,结果如下:

[echo] Found 'xyz.name' in files : '3'
[echo] Found 'xyz.version' in files : '3'
[echo] Found 'xyz.general' in files : '3'
[echo] Found 'xyz.generalXXX' in files : '3'

结果'3'属于第一个带'xyz.name'的循环,是的,所有文件中都有3个匹配。但其他字符串在所有文件中都有其他匹配项。任何文件中都没有'xyz.generalXXX'字符串!

问题:如何为所有文件中的所有字符串获得正确的结果?

ad 2。为了获得灵活性,最终解决方案需要使用

等属性替换列表字符串
<for list="${dtdNames}" param="search4" delimiter=",">

对属性$ {dtdNames}从srcFile中读取一个字符串(见上文),是的,它以逗号分隔,没有换行!并使用echo命令进行检查。

但是该引用失败了

[echo] Found '${dtdNames}' in files : '0'

所以似乎&lt; for /&gt;不允许与财产合作? 如何正确写出?