要在文件集中搜索多个字符串,我尝试使用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”
答案 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;不允许与财产合作? 如何正确写出?