2009-04-17 20 views

Respuesta

16

Algo así como:

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

Usted puede envolver que de esta manera:

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

Y luego jarscan org.jboss.Main va a buscar esa clase en todos los archivos jar encontrado en el directorio actual

+3

Usando 'unzip -l' en su lugar para 'jar' lo hizo funcionar muy rápido. 'jar' tardó 72 segundos frente a 4 segundos cuando se ejecutó con 'unzip -l' –

+0

Vine aquí para decir exactamente esto. +1 –

+0

Si quiero saber en qué jar se puede encontrar cierta clase, generalmente hago algo como cd ~/.m2/repository; grep -r -H "nombre de clase" *. – extraneon

1

Ahora, para responder a esta pregunta, hay un comando de shell simple que lo hizo por nosotros.

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

Si necesitas resultado sólo entonces se puede instalar agentransack http://www.mythicsoft.com/agentransack/ y hacer una búsqueda de texto que contiene. Agentransack también busca dentro de los archivos jar y zip.

1

Hace años escribí una utilidad classfind para resolver problemas como este. Establezca su ruta de clases para que apunte a su conjunto .jar, y classfind le dirá en qué jarras encontrará una clase en particular.

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

No responder directamente a su pregunta, pero tal vez esto va a resolver su problema: se puede imprimir la ubicación (por ejemplo, el archivo JAR) de la que una clase específica se cargó mediante la adición de una simple línea de código:

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

Entonces sabrá con certeza de dónde viene.

3

La herramienta JAR Explorer es bastante útil.

Abre una ventana de GUI con dos paneles. Puede elegir un directorio, la herramienta escaneará todos los archivos JAR en ese directorio y luego le permitirá buscar una clase específica. El panel inferior se ilumina con una lista de resultados para esa clase en todos los archivos JAR escaneados.

+0

Nueva URL de esta herramienta: https://github.com/javalite/jar-explorer – ipolevoy

1

Es posible que también desee echarle un vistazo a la herramienta Java JarScan.

Se puede buscar por nombre de clase y por paquete.

Ayuda mucho cuando Total Commander no está disponible y solo se permite ejecutar Java.

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; 
Cuestiones relacionadas