2011-10-14 11 views
18

Estoy buscando un archivo .class dentro de un grupo de jarras.Lista de contenidos de varios archivos jar

jar tf abc.jar 

funciona para un solo archivo. Intenté

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

imprime nada. La única solución que puedo pensar es descomprimir todo, luego buscar. ¿Hay una mejor manera? Estoy en LUnix.

Editar: Al escanear muchos frascos, es útil imprimir el nombre del archivo jar junto con la clase. Este método funciona bien: salida

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

muestra producida:

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

Su edición es exactamente lo que estaba buscando. Gracias – Lucas

Respuesta

31

lo necesario para pasar -n 1 a xargs para obligarlo a ejecutar un comando separado jar para cada nombre de archivo que se pone de find:

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

De lo contrario xargs 's línea de comandos se parece jar tf file1.jar file2.jar..., que tiene una diferente significado para lo que se pretende.

Una técnica de depuración útil es pegarse echo antes del comando a ser ejecutado por xargs:

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

Esto imprimiría el comando completo jar en lugar de ejecutar, de manera que se puede ver lo que está mal con él .

+6

Excelente consejo con el "eco" – im8bit

+0

gracias. Esto ahorró mucho tiempo –

+0

puede modificar el comando find -name "* .jar" | xargs -n 1 jar tf para mostrar qué contenido del archivo se muestra? –

-1

Si está utilizando Eclipse, puede crear un proyecto y añadir todos los frascos. Luego podrá encontrar una clase en cualquiera de los frascos.

1

También puede utilizar la opción de encontrar -exec

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

También puede utilizar de descompresión que es más rápido que el tarro (opción -l para imprimir el contenido de zip).

Por ejemplo, un pequeño script que hace más o menos lo que quiere:

#!/bin/bash 

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

Esto es lo que utilizo en Cygwin. Admite encabezados de sección por archivo jar como se solicitó anteriormente.

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

Para * nix, deje caer el ".exe":

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

que se enfrentó a una situación similar donde tengo que buscar una clase en una lista de archivos jar presentes en un directorio. También quería saber de qué archivo jar pertenece la clase. Utilicé este fragmento de código a continuación (script de shell) y descubrí que era útil. Debajo de la secuencia de comandos aparecerá una lista de los archivos jar que contiene la clase que se buscará.

#!/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 tomado de: http://alvinalexander.com/blog/post/java/shell-script-search-search-multiple-jar-files-class-pattern

+0

Intente agregar más contexto, no solo publicar un enlace, ya que puede volverse obsoleto en el futuro. – mjuarez

+0

gracias por sus entradas piet.t @ y mjuarez @. Actualizado mi respuesta en consecuencia. siéntase libre de proporcionar sus entradas. ¡Gracias! –

+0

¿Te preguntas por qué es tan lento? –

0

no veo la necesidad de utilizar exec, esto funcionó para mí en Cygwin en Windows:

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