2010-12-07 62 views
2

是否有可能在Ant复制任务中复制当前文件名?我想运行一个脚本的BeanShell并希望访问到当前文件名:在Ant复制任务过滤器中获取文件名

<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> 

回答

3

这已被窃听我一会儿 - 我希望会有一个很好的办法做到这一点,但我还没有找到它。

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

我想出的最坏的选择是使用ant-contrib 'for' task遍历文件集并逐个复制每个文件。在迭代过程中,文件的名称可在“参数”属性中指定的属性中使用:

<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>