【问题标题】:ant-contrib for loop task failsant-contrib for loop 任务失败
【发布时间】:2013-10-22 14:05:41
【问题描述】:

为了在文件集中搜索多个字符串,我尝试使用 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”

【问题讨论】:

标签: ant ant-contrib


【解决方案1】:

您需要为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

【讨论】:

  • 结束了 ant-contrib-0.6.jar 让它运行.. NOT -0.3.jar!
  • 请注意,net/sf/antcontrib/antcontrib.properties 据说仅适用于 this 页面上的 ant 1.5 或更低版本。如果它对你有用,那就太好了!
  • 您应该使用最新版本 1.0b3 / 2006-11-02 和 正如 S.R.I 在他的回答和上面的评论中所说的那样.
【解决方案2】:

基本示例也有效,第一次发布时描述的需求

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

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

<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个问题

ad 1. 使用

[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'

所以看来 不允许使用属性? 怎么写正确?

【讨论】:

  • 只需将 ${dtdNames} 更改为 ${list} 即可解决问题 #2。 ` ` 但是问题 #1 仍然没有解决!为所有文件中列表中每个字符串的单个匹配项获得正确列表的解决方案是什么?
  • 你应该删除这个。这不是一个答案......你在这里问过这个问题:stackoverflow.com/questions/19753345/…
猜你喜欢
  • 2011-09-15
  • 2014-03-09
  • 2011-07-04
  • 2012-01-24
  • 2013-09-22
  • 1970-01-01
  • 1970-01-01
  • 2012-09-13
  • 1970-01-01
相关资源
最近更新 更多