Stiamo visualizzando una versione precedente di una classe utilizzata, sebbene sia stata distribuita l'ultima. Per eseguire la scansione di tutti i file JAR in tutte le sottocartelle di un server delle applicazioni, come scrivere un piccolo script della shell che stampa il nome del file dei file JARS in cui è stata trovata questa classe specifica?JarScan, esegue la scansione di tutti i file JAR in tutte le sottocartelle per la classe specifica
JarScan, esegue la scansione di tutti i file JAR in tutte le sottocartelle per la classe specifica
risposta
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
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
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.
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
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.
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.
Nuovo URL per questo strumento: https://github.com/javalite/jar-explorer – ipolevoy
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.
#! /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;
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" –
Sono venuto qui per dire esattamente questo. +1 –
Se voglio sapere in quale jar è possibile trovare una determinata classe, di solito faccio qualcosa come cd ~/.m2/repository; grep -r -H "classname" *. – extraneon