在Ant复制任务筛选器中获取文件名

时间:2010-12-07 12:56:40

标签: ant copy filenames

是否可以在Ant复制任务中复制当前文件名?我正在尝试运行beanshell脚本,并希望访问当前文件名:

<target>
    <mkdir dir="${project.build.directory}/generated-sources"/>
    <copy todir="${project.build.directory}/generated-sources"
          includeemptydirs="true" failonerror="true" verbose="true">
        <fileset dir="${project.build.sourceDirectory}"/>
        <filterchain>
            <tokenfilter>
                <filetokenizer/>
                <scriptfilter language="beanshell" byline="true"><![CDATA[
                    import java.io.BufferedReader;
                    import java.io.StringReader;
                    int count = 1;
                    BufferedReader br = new BufferedReader(new StringReader(self.getToken()));
                    StringBuilder builder = new StringBuilder();
                    String line;
                    while ((line = br.readLine()) != null) {
                        builder.append(line.replace("\"__LINE__\"", Integer.toString(count))).append('\n');
                        count++;
                    }
                    self.setToken(builder.toString());
                ]]></scriptfilter>
            </tokenfilter>
        </filterchain>
    </copy>
</target>

1 个答案:

答案 0 :(得分:3)

这一直困扰着我一段时间 - 我希望有一个很好的方法来做到这一点,但我还没有找到它。

我已经看过'复制'任务的Ant源代码了。实际副本在ResourceUtils类中完成,但源文件和目标文件的名称不会以使其可从过滤链访问的方式公开。类似地,文件集的迭代发生在copy taskdef中,其中“当前”文件名不保存在公共变量中。

我提出的最不好的选择是使用ant-contrib 'for' task迭代文件集并逐个复制每个文件。在迭代时,文件的名称随后可在'param'属性中指定的属性中使用:

<for param="file.name">
  <path>
    <fileset dir="${project.build.sourceDirectory}"/>
  </path>
  <sequential>
    <local name="file.name"/>
    <property name="file.name" value="@{file.name}"/>
    <copy file="${file.name}" ... >
      ...
      <filterchain>
        <scriptfilter ...>
          ...
          current_file = project.getProperty( "file.name" );
          ...
        </scriptfilter>
      </filterchain>
      ...
    </copy>
  </sequential>
</for>