2009-04-17 5 views

risposta

16

Qualcosa di simile:

find . -name '*.jar' | while read jarfile; do if jar tf "$jarfile" | grep org/jboss/Main; then echo "$jarfile"; fi; done 

Puoi avvolgere che in questo modo:

jarscan() { 
    pattern=$(echo $1 | tr . /) 
    find . -name '*.jar' | while read jarfile; do if jar tf "$jarfile" | grep "$pattern"; then echo "$jarfile"; fi; done 
} 

E poi jarscan org.jboss.Main cercherà per tale classe in tutti i file jar si trova sotto la directory corrente

+3

L'utilizzo di "unzip -l" invece di "jar" lo ha eseguito molto velocemente. "jar" ha impiegato 72 secondi contro 4 secondi se eseguito con "unzip -l" –

+0

Sono venuto qui per dire esattamente questo. +1 –

+0

Se voglio sapere in quale jar è possibile trovare una determinata classe, di solito faccio qualcosa come cd ~/.m2/repository; grep -r -H "classname" *. – extraneon

1

Ora per rispondere a questa domanda ecco un semplice comando della shell che lo ha fatto per noi.

for jarFile in $(
    ls -R | 
    awk ' 
     match($0, ".*:") { 
      folder=$0 
     } 
     ! match($0, ".*:") { 
      print folder$0 
     }' | 
     grep "\.jar" | 
     sed -e "s/:/\//g" 
); 
do 
    unzip -l $jarFile; 
done | 
awk ' 
    match($0, "Archive.*") { 
     jar=$0 
    } 
    ! match($0, "Archive.*") { 
     print jar" : "$0 
    }' | 
grep org.jboss.Main 
2

Se è necessario solo il risultato, è possibile installare agentransack http://www.mythicsoft.com/agentransack/ ed eseguire una ricerca di testo contenente. Agentransack effettua ricerche anche all'interno di file jar e zip.

1

anni fa ho scritto un'utilità classfind per risolvere problemi come questo. Imposta il tuo classpath in modo che punti al tuo .jar set, e classfind ti dirà in quali jar troverà una particolare classe.

example% classfind -c Document 
/usr/java/j2sdk1.4.0/jre/lib/rt.jar -> org.w3c.dom.Document 
/usr/java/j2sdk1.4.0/jre/lib/rt.jar -> javax.swing.text.Document 
4

Senza rispondere direttamente alla tua domanda, ma forse questo risolverà il problema: è possibile stampare la posizione (ad esempio, il file jar) da cui una specifica classe è stata caricata con l'aggiunta di una linea semplice al codice:

System.err.println(YourClass.class.getProtectionDomain().getCodeSource()); 

Quindi saprete per certo da dove proviene.

3

Lo strumento JAR Explorer è piuttosto utile.

Apre una finestra della GUI con due pannelli. Puoi scegliere una directory, lo strumento eseguirà la scansione di tutti i file JAR in quella directory, quindi ti permetterà di cercare una classe specifica. Il pannello inferiore si accende quindi con un elenco di hit per quella classe in tutti i file JAR scansionati.

+0

Nuovo URL per questo strumento: https://github.com/javalite/jar-explorer – ipolevoy

1

Si consiglia inoltre di dare un'occhiata allo strumento Java JarScan.

Si può cercare per nome classe e per pacchetto.

Aiuta molto quando Total Commander non è disponibile e solo Java è autorizzato ad eseguire.

1
#! /bin/sh 

path=$1 
segment=$2 

if [ -z "$path" ] || [ -z "$segment" ] 
then 
    echo "Usage: $0 <path> <segment>" 
    exit 
fi 

for jar in $path/*.jar ; do echo " *** $jar *** " ; jar tf $jar| grep --color=always $segment; done;