3

我有一个 ant 属性 ${src.dirs} ,其中包含一个用分号分隔的目录列表。现在我需要指定文件集(用于替换正则表达式),并且该文件集必须包含 ${src.dirs} 中列出的所有目录中的所有 java 文件。我该怎么做(我不使用任何 ant-contrib 时髦的东西,我使用普通的香草蚂蚁)。

有这种src.dirs形式: /usr/work/dir1/src;/usr/work/java/dir2/src;/usr/libabc/src 有一个关于如何使用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}"/>

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

4

3 回答 3

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在您的情况下,您可能会考虑将其调整为不使用文件集属性中的根目录。

于 2013-05-07T21:12:30.927 回答
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>

但是,任何文件名(包括它们的路径)中的空格都会让你感到厌烦。

于 2013-05-07T21:13:49.417 回答
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/>.

于 2013-05-07T22:19:53.060 回答