从属性中以分号分隔的列表创建文件集

时间:2013-05-07 20:03:56

标签: ant

我有一个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}"/>

这些正则表达式确保尾随逗号或分号不会产生错误的文件选择器。

3 个答案:

答案 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/>