2009-09-22 8 views
13

Voglio mettere un insieme di file che assomigliano a questo in un vaso:Come rinominare i file quando sono inclusi in un jar dall'attività jar della formica?

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

Nel processo, voglio che tutti loro ridenominati come segue:

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

speravo di utilizzare un mapper per realizzare questo, ma gli elementi set di file che sto usando e l'attività jar non sembrano supportarlo da nessuna parte.

Come si applica un mapper quando si costruisce un vaso, oppure come posso eseguire una trasformazione come questa? Voglio evitare di copiare tutti i file nella struttura di directory che voglio e fare duplicati dappertutto, il che è il modo in cui il nostro sistema di compilazione funziona ora.

risposta

2

Aggiornamento: probabilmente si desidera lo copy task anziché spostarsi, ma lo regexp mapper funziona allo stesso modo sia per la copia che per lo spostamento.

Il seguente regexp copierà tutti i jar nella directory jars in jars_out, mappando [cartella]/[file] .jar in [cartella] _ [file] .jar.

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

Il mappatore regexp necessita di un jar di implementazione regexp appropriato sul classpath per funzionare. Varie implementazioni sono disponibili:

+0

Aggiungerò un esempio per mostrare come –

+0

Questo è ottimo ma non raggiunge il mio obiettivo di creare il barattolo senza fare copie extra dei file. Spostare eviterebbe le copie, ma poi i vasi verrebbero ricostruiti ogni volta che costruisco invece che solo se i loro file sorgente sono stati modificati. – skiphoppy

+0

Tuttavia, il tag mapper che hai creato è fantastico, e lo prenderò in prestito invece di venire con uno dei miei. :) Non mi ero ancora spinto abbastanza per costruire il mapper di cui avevo ancora bisogno dato che non riuscivo a far funzionare nessun elaboratore con set di file e jar. – skiphoppy

17

È possibile utilizzare un zipfileset con attributo fullpath rinominare il nome file nel vaso:

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

Non puoi usare un mappatore con questa tecnica però, dovrete elencare ogni file jar esplicitamente. Se si può supporre che ogni file è denominato my.jar, e sono tutti in una directory figlio diretto, è possibile utilizzare il target subant al glob tutti in su:

<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 Bel modo semplice per rinominare un file durante l'operazione jar. Grazie. – Damo

2

Se non si vuole (o può 'prontamente) elencare ogni file singolarmente, una soluzione è utilizzare l'operazione Zip, che consente l'nidificazione di <mappedresources> (Ant 1.8.0+). Una volta completata l'attività Zip, puoi utilizzare l'attività Jar per aggiungere/aggiornare il manifest e/o aggiungere un indice.

Supponiamo, per esempio, che oltre a voler

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

nel vaso di uscita, si hanno anche una directory stuff/, contenente alcuni file e sottodirectory. Se si desidera che il contenuto di stuff/ inclusi nel vaso, ma si vuole stuff/subdir/* da aggiungere come other_subdir/*, considerare quanto segue:

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

Ho provato questo file di generazione e funziona con Ant 1.8.2. Tuttavia, se dopo averlo modificato, Ant inizia a lanciare un valore NullPointerException, vedere Bug 54026.