1

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

<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”

4

2 回答 2

2

您需要添加taskdeffor ant-contrib-0.3.jar。ant-contrib安装页面告诉你怎么做:

<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
于 2013-10-22T17:04:32.270 回答
-1

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

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

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

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

这有两个问题

广告 1. <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”字符串!

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

广告 2.为了灵活性,最终解决方案需要将列表字符串替换为类似的属性

<for list="${dtdNames}" param="search4" delimiter=",">

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

但是那个参考失败了

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

所以似乎 <for /> 不允许使用属性?如何正确写?

于 2013-10-29T00:18:22.037 回答