2010-12-07 45 views
2

Est-il possible de copier le nom de fichier actuel dans une tâche Ant? Je suis en train d'exécuter un script BeanShell et désire avoir accès au nom de fichier actuel:Obtention du nom de fichier dans le filtre de tâche de copie 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> 

Répondre

3

Cela a été me tracasse depuis un certain temps - j'espérais là pour ce faire serait une belle façon, mais je l'ai pas encore trouvé.

J'ai regardé le code source Ant pour la tâche 'copier'. La copie réelle est effectuée dans la classe ResourceUtils, mais les noms des fichiers source et de destination ne sont pas exposés de manière à les rendre accessibles depuis la chaîne de filtres. De même, l'itération sur l'ensemble de fichiers a lieu dans le copy taskdef où les noms de fichiers 'current' ne sont pas conservés dans des variables publiques.

La moins mauvaise option que j'ai trouvée est d'utiliser un ant-contrib 'for' task pour parcourir le groupe de fichiers et copier chaque fichier un par un. Au cours de l'itération, les noms des fichiers sont alors disponibles dans la propriété spécifiée dans l'attribut '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>