2011-10-14 13 views
18

Sto cercando un file .class all'interno di un gruppo di barattoli.Elenco contenuto di più file jar

jar tf abc.jar 

funziona per un file. Ho provato

find -name "*.jar" | xargs jar tf 

stampe nulla. L'unica soluzione a cui riesco a pensare è decomprimere tutto, quindi cercare. C'è un modo migliore? Sono su LUnix.

Edit: Durante la scansione di molti vasi, è utile per stampare il nome del file jar insieme con la classe. Questo metodo funziona bene: uscita

find . | grep jar$ | while read fname; do jar tf $fname | grep SchemaBuilder && echo $fname; done 

Esempio prodotto:

1572 Wed Jul 25 10:20:18 EDT 2007 org/apache/ws/commons/schema/SchemaBuilder$1.class 
    1718 Wed Jul 25 10:20:18 EDT 2007 org/apache/ws/commons/schema/SchemaBuilder$2.class 
42607 Wed Jul 25 10:20:18 EDT 2007 org/apache/ws/commons/schema/SchemaBuilder.class 
./XmlSchema-1.3.2.jar 
    1572 Wed Jul 25 10:20:18 EDT 2007 org/apache/ws/commons/schema/SchemaBuilder$1.class 
    1718 Wed Jul 25 10:20:18 EDT 2007 org/apache/ws/commons/schema/SchemaBuilder$2.class 
42607 Wed Jul 25 10:20:18 EDT 2007 org/apache/ws/commons/schema/SchemaBuilder.class 
./XmlSchema.jar 
+5

tua modifica è esattamente quello che ho stavo cercando. Grazie – Lucas

risposta

31

è necessario passare -n 1-xargs per forzarlo ad eseguire un comando separato jar per ogni nome di file che si ottiene da find:

find -name "*.jar" | xargs -n 1 jar tf 

Altrimenti xargs 's linea di comando si presenta come jar tf file1.jar file2.jar..., che ha un diverso significato per ciò che è inteso.

Una tecnica di debug utile è quello di attenersi echo prima del comando da eseguire per xargs:

find -name "*.jar" | xargs echo jar tf 

Questo sarebbe stampare il comando completo jar invece di eseguirlo, in modo da poter vedere cosa c'è che non va .

+6

Consiglio eccellente con "echo" – im8bit

+0

grazie. Questo ha risparmiato un sacco di tempo –

+0

puoi modificare il comando find -name "* .jar" | xargs -n 1 jar tf per mostrare quale contenuto del file viene mostrato? –

-1

Se si utilizza Eclipse, è possibile creare un progetto e aggiungere tutti i barattoli. Sarai quindi in grado di trovare una classe in uno dei barattoli.

1

È anche possibile utilizzare -exec possibilità di trovare

find . -name "*.jar" -exec jar tf {} \; 
0

È inoltre possibile utilizzare unzip che è più veloce di vaso (opzione -l per stampare il contenuto zip).

Per esempio, un piccolo script che fa più o meno quello che si vuole:

#!/bin/bash 

for i in $(find . -name "*.jar") 
do 
    if [ -f $i ] 
then 
    echo $i 
    unzip -l $i | grep $* 
fi 
done 
1

Ecco quello che uso in Cygwin. Supporta le intestazioni di sezione per file jar come richiesto sopra.

find . -name "*.jar" \ 
-exec echo ======\ {}\ ====== \; \ 
-exec /c/Program\ Files/Java/jdk1.7.0_45/bin/jar.exe tf {} \; | less 

Per * nix, far cadere il ".exe":

find . -name "*.jar" \ 
-exec echo ======\ {}\ ====== \; \ 
-exec jar tf {} \; | less 
1

ho affrontato una situazione simile in cui ho bisogno per la ricerca di una classe in un elenco di file jar presenti in una directory. Inoltre volevo sapere da quale file jar appartiene la classe. Ho usato questo sotto snippet di codice (script di shell) e ho trovato utile. Sotto lo script verranno elencati i file jar che contengono la classe da cercare.

#!/bin/sh 
LOOK_FOR="codehaus/xfire/spring" 
for i in `find . -name "*jar"` 
do 
    echo "Looking in $i ..." 
    jar tvf $i | grep $LOOK_FOR > /dev/null 
    if [ $? == 0 ] 
    then 
    echo "==> Found \"$LOOK_FOR\" in $i" 
    fi 
done 

Shell script tratto da: http://alvinalexander.com/blog/post/java/shell-script-search-search-multiple-jar-files-class-pattern

+0

Si prega di provare ad aggiungere più contesto, non solo pubblicare un collegamento, poiché potrebbe diventare obsoleto in futuro. – mjuarez

+0

grazie per i tuoi input piet.t @ e mjuarez @. Aggiornato la mia risposta di conseguenza. sentiti libero di fornire i tuoi input. Grazie! –

+0

Mi chiedo perché è così lento? –

0

non vedo la necessità di utilizzare exec, questo ha lavorato per me in Cygwin su Windows:

find . -name "*.jar" | while read jarfile; do unzip -l $jarfile | fgrep "foo" ; done