2010-12-07 55 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>