2009-09-22 7 views
13

Je veux mettre un ensemble de fichiers qui ressemblent à ceci dans un bocal:Comment renommer un fichier lorsqu'il est inclus dans une tâche jar by the jar de ant?

yay/my.jar 
boo/my.jar 
foo/my.jar 
bar/my.jar 

Dans le processus, je veux tous renommés comme suit:

yay_my.jar 
boo_my.jar 
foo_my.jar 
bar_my.jar 

J'espérais utiliser un mappeur pour accomplir ceci, mais les éléments de fileset que j'utilise et la tâche de jar ne semblent pas le soutenir n'importe où.

Comment appliquer un mappeur lors de la construction d'un pot, ou comment puis-je effectuer une transformation comme celle-ci? Je veux éviter de copier tous les fichiers dans la structure de répertoires que je veux et de créer des doublons partout, ce qui est le fonctionnement de notre système de construction.

Répondre

2

Mise à jour: vous voulez probablement le copy task plutôt que de le déplacer, mais le regexp mapper fonctionne de la même façon pour copier et déplacer. L'expression rationnelle suivante copiera tous les fichiers jars dans le répertoire jars vers jars_out, en mappant [dossier]/[fichier] .jar vers [dossier] _ [fichier] .jar.

<copy todir="./jars_out"> 
    <fileset dir="jars"/> 
    <mapper type="regexp" from="([^/\\]*)[/\\](.*)\.jar$$" to="\1_\2.jar"/> 
</copy> 

Le mappeur regexp a besoin d'un pot de mise en œuvre regexp appropriée sur le classpath au travail. Diverses mises en oeuvre sont disponibles:

+0

Je vais ajouter un exemple pour montrer comment –

+0

C'est génial mais n'atteint pas mon objectif de construire le pot sans faire des copies supplémentaires des fichiers. Déplacer éviterait les copies, mais les bocaux seraient reconstruits chaque fois que je construisais au lieu de seulement si leurs fichiers sources avaient changé. – skiphoppy

+0

Cependant, le tag mapper que vous avez construit est génial, et je vais emprunter cela au lieu de venir avec l'un des miens. :) Je n'étais pas encore assez avancé pour construire réellement le mappeur dont j'avais besoin car je ne pouvais pas avoir de mappeur pour travailler avec le groupe de fichiers et le pot. – skiphoppy

17

Vous pouvez utiliser un zipfileset avec un attribut fullpath pour renommer le nom du fichier dans le pot:

<jar destfile="newjar.jar"> 
    <zipfileset dir="yay" includes="my.jar" fullpath="yay_my.jar"/> 
    <zipfileset dir="boo" includes="my.jar" fullpath="boo_my.jar"/> 
    <!-- etc. --> 
</jar> 

Vous ne pouvez pas utiliser Un mappeur avec cette technique cependant, vous devrez lister chaque fichier Jar explicitement. Si vous pouvez supposer que chaque fichier est nommé my.jar, et ils sont tous dans un répertoire enfant immédiat, vous pouvez utiliser la cible subant pour les glob tout:

<target name="glom"> 
    <subant genericantfile="${ant.file}" target="update-jar"> 
     <dirset dir="." includes="*"/> 
    </subant> 
</target> 

<target name="update-jar"> 
    <basename file="${basedir}" property="dirname"/> 
    <property name="path" value="${dirname}_my.jar"/> 
    <jar destfile="../newjar.jar" update="yes"> 
     <zipfileset dir="." includes="my.jar" fullpath="${path}"/> 
    </jar> 
</target> 
+0

+1 Un moyen facile de renommer un fichier pendant la tâche jar. Merci. – Damo

2

Si vous ne voulez pas (ou peut 't facilement) liste chaque fichier individuellement, une solution est d'utiliser la tâche Zip, ce qui permet un <mappedresources> imbriqué (Ant 1.8.0+). Une fois la tâche Zip terminée, vous pouvez utiliser la tâche Jar pour ajouter/mettre à jour le manifeste et/ou ajouter un index.

Supposons, par exemple, qu'en plus de vouloir

 
yay_my.jar 
boo_my.jar 
foo_my.jar 
bar_my.jar 

dans le JAR de sortie, vous avez aussi un répertoire stuff/, contenant des fichiers et des sous-répertoires. Si vous voulez le contenu de stuff/ inclus dans le JAR, mais vous voulez stuff/subdir/* à ajouter comme other_subdir/*, considérer les points suivants:

<zip destfile="newjar.jar"> 
    <zipfileset dir="yay" includes="my.jar" fullpath="yay_my.jar"/> 
    <zipfileset dir="boo" includes="my.jar" fullpath="boo_my.jar"/> 
    <!-- etc. --> 

    <mappedresources> 
     <fileset dir="stuff"/> 
     <compositemapper> 
      <globmapper from="subdir/*" to="other_subdir/*"/> 
      <identitymapper/> 
     </compositemapper> 
    </mappedresources> 
</zip> 
<!-- Update the newly-created ZIP in-place to add a basic manifest --> 
<jar destfile="newjar.jar" update="true"/> 

J'ai testé ce fichier de construction et il fonctionne avec Ant 1.8.2. Cependant, si après le changement, Ant commence à lancer NullPointerException, voir Bug 54026.

Questions connexes