2010-03-26 18 views
28

Come scrivere un'attività ant che rimuove i file da un JAR precedentemente compilato?ant per rimuovere file da un jar

Diciamo che i file in mio vaso sono:

aaa/bbb/ccc/Class1 
aaa/bbb/ccc/Class2 
aaa/bbb/def/Class3 
aaa/bbb/def/Class4 

... e voglio una versione di questo file JAR, senza il pacchetto aaa.bbb.def, e ho bisogno di striscia fuori usando formica, in modo tale che io finire con un JAR che contiene:

aaa/bbb/ccc/Class1 
aaa/bbb/ccc/Class2 

Grazie!

risposta

55

Hai provato a usare il compito zipfileset?

<jar destfile="stripped.jar"> 
    <zipfileset src="full.jar" excludes="files/to/exclude/**/*.file"/> 
</jar> 

Ad esempio:

<property name="library.dir" value="dist"/> 
<property name="library.file" value="YourJavaArchive.jar"/> 
<property name="library.path" value="${library.dir}/${library.file}" /> 
<property name="library.path.new" value="${library.dir}/new-${library.file}"/> 

<target name="purge-superfluous"> 
    <echo>Removing superfluous files from Java archive.</echo> 

    <jar destfile="${library.path.new}"> 
     <zipfileset src="${library.path}" excludes="**/ComicSans.ttf"/> 
    </jar> 

    <delete file="${library.path}" /> 
    <move file="${library.path.new}" tofile="${library.path}" /> 
</target> 
+0

@mipadi Grazie per la risposta! Speravo che esistesse un metodo senza uno stage intermedio, ovvero che rimuovesse direttamente file/cartelle dal Jar. In mancanza di ciò, immagino che questo sia il più vicino ci arriverò! – bguiz

+0

Solo una FYI, probabilmente la maggior parte lo sa, ma non ci ho pensato :-). L'attività "jar" modificherà MANIFEST.MF del JAR, che nel mio caso ha causato problemi. Ho appena aggiunto l'attributo "manifest" all'attività jar e l'ho puntato al manifest che volevo che usasse. Ottima risposta, sicuramente mi ha aiutato, grazie! – Craig

+1

Potrebbe anche usare 'zip' invece di' jar' per evitare di cambiare MANIFEST.MF – npostavs

5

Devi unjar e rejar.

<unzip src="myjar.jar" dest="/classes/"> 
<jar destfile="newjar.jar" 
    basedir="/classes/" 
    includes="**/*" 
    excludes="**/def/*" 
/>  
1

Se un vaso-file di programma capace di archiviazione, come ad esempio "Zip" su Linux, è disponibile, il compito può essere fatto da

 
<exec executable="zip">    
<arg value="-d"/>    
<arg value="myJarCopyToStrip.jar"/>    
<arg value="aaa/bbb/def/*>    
<arg value="aaa/bbb/def> 
</exec> 

sottostruttura eliminazione dipende dalle capacità del archiviazione utilizzato.
L'attributo "os" del task Ant "exec" consente di utilizzare diversi archiver su diversi SO.

1

Sono venuto qui cercando di usare formica come soluzione per alcune scorciatoie in gradle unzip.

Nel caso in cui qualcun altro si trovi sulla stessa barca.

Ecco un esempio:

task antUnzip() << { 

      ant.jar(destfile : "stripped.jar") { 
       zipfileset (src : "full.jar", excludes : "files/to/exclude/**/*.file") { 
       } 
      } 
} 
Problemi correlati