我有一个ant属性$ {src.dirs},其中包含由分号分隔的目录列表。 现在我需要指定fileset(对于replaceregexp),并且该文件集必须包含$ {src.dirs}中列出的所有目录中的所有java文件。 我怎么能这样做(我不使用任何ant-contrib funcky的东西,我使用普通的香草蚂蚁)。
src.dirs
有以下形式:/usr/work/dir1/src;/usr/work/java/dir2/src;/usr/libabc/src
There's is an example关于如何使用propertyregex,但是当我尝试使用它时,我收到此错误:
build.xml:98: Problem: failed to create task or type propertyregex
修改: 这是我的最终解决方案:
<loadresource property="source.dir.javafiles">
<propertyresource name="source.dir"/>
<filterchain>
<tokenfilter>
<replaceregex pattern="\s*([;,]\s*)*$" replace="/**/*.java"/>
<replaceregex pattern="\s*([;,]\s*)+" replace="/**/*.java," flags="g"/>
</tokenfilter>
</filterchain>
</loadresource>
<fileset dir="" includes="${source.dir.javafiles}"/>
这些正则表达式确保尾随逗号或分号不会产生错误的文件选择器。
答案 0 :(得分:2)
您可以在不使用ant-contrib的情况下执行此操作。这是一种可能性:
<property
name="dirlist"
value="/usr/work/dir1/src;/usr/work/java/dir2/src;/usr/libabc/src" />
<property name="file.wildcard" value="*.java" />
<loadresource property="dirs.include">
<propertyresource name="dirlist"/>
<filterchain>
<tokenfilter>
<replaceregex pattern="^/" replace="" />
<replaceregex pattern=";/" replace="/**/${file.wildcard}," flags="g"/>
<replaceregex pattern="$" replace="/**/${file.wildcard}" />
</tokenfilter>
</filterchain>
</loadresource>
<fileset id="files" dir="/" includes="${dirs.include}" />
工作分为两部分:首先进行字符串处理,将分号分隔的列表转换为适合fileset
includes
属性使用的模式;第二个从模式中创建一个文件集。
这里的loadresource
任务只是用作一系列简单正则表达式替换的包装器。这三个替换处理领先的根目录\
,将字符串内的分号扩展为Ant模式和逗号(在includes
属性中用于分隔条目),并在末尾添加模式字符串。
在您的情况下,您可以考虑将其调整为不使用文件集的dir
属性中的根目录。
答案 1 :(得分:2)
propertyregex
来自ant-contrib,这就是为什么该示例不适合您。
这是实现目标的一种方法。
<pathconvert property="src.dirs.includes" pathsep="/**/*.java,">
<path path="${src.dirs}" />
</pathconvert>
<replaceregexp match="\s+" replace=" " flags="g" byline="true">
<files id="files" includes="${src.dirs.includes}/**/*.java" />
</replaceregexp>
但是,任何文件名中的空格(包括它们的路径)都会让你满意。
答案 2 :(得分:0)
您是否只需要浏览这些目录并进行编译,或者由于依赖性而必须将这些目录编译在一起?
如果没有依赖项,您可以尝试Ant-Contrib中的<for/>
任务。这使您可以遍历列表,如下所示:
<for list="${src.dirs}"
param="my.src.dir"
delimiter=";">
<sequential>
<javac destdir="${javac.destdir}"
srcdir="@{my.src.dir}"
classpathref="main.classpath"/>
</sequential>
</for>
当然,您可能需要为正确的destdir
进行操作。使用<var/>
任务时,您可能会发现<for/>
任务很方便。 <var/>
任务允许您重置变量名称。当您重复<sequential/>
个任务集时,您可能会发现要重置某些属性。
顺便说一句,如果你有Ant 1.8或更高版本,你可以使用<local/>
任务代替<var/>
。