java - anlyticsed - Lista de contenidos de mĂșltiples archivos jar
all minecraft title screen messages (9)
Estoy buscando un archivo .class dentro de un montón de frascos.
jar tf abc.jar
Funciona para un archivo. Lo intenté
find -name "*.jar" | xargs jar tf
no imprime nada La única solución que se me ocurre es descomprimir todo y luego buscar. ¿Hay alguna manera mejor? Estoy en lunix
Editar : cuando se escanean muchos archivos jar, es útil imprimir el nombre del archivo jar junto con la clase. Este método funciona bien:
find . | grep jar$ | while read fname; do jar tf $fname | grep SchemaBuilder && echo $fname; done
Salida de 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
Encuentre archivos jar y obtenga todas las clases y miembros guardados en un txt.
(for j in $(find -name ''*.jar'');do echo "--$j --";jar tf $j | grep .class | sed ''s#/#.#g'' | sed ''s/.class/ /g'' | xargs -n 1 javap -classpath $j ; done;) >> classes.txt
Esto es lo que uso en Cygwin. Admite encabezados de sección por archivo jar como se solicita anteriormente.
find . -name "*.jar" /
-exec echo ======/ {}/ ====== /; /
-exec /c/Program/ Files/Java/jdk1.7.0_45/bin/jar.exe tf {} /; | less
Para * nix, suelte el ".exe":
find . -name "*.jar" /
-exec echo ======/ {}/ ====== /; /
-exec jar tf {} /; | less
Me enfrenté a una situación similar en la que necesito 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 (shell script) y me resultó útil. La siguiente secuencia de comandos mostrará una lista de los archivos jar que contienen la clase a 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
No veo la necesidad de usar exec, esto me funcionó en Cygwin en Windows:
find . -name "*.jar" | while read jarfile; do unzip -l $jarfile | fgrep "foo" ; done
Si está utilizando Eclipse, puede crear un proyecto y agregar todos los archivos jar. Entonces podrás encontrar una clase en cualquiera de los frascos.
Si llega a esta pregunta y necesita extraer todos los archivos jar en un entorno de Windows, vaya al directorio donde ha guardado todos los archivos jar y guarde un archivo por lotes con el siguiente contenido:
for /r %%f in (*) do jar -xvf %%f
Al ejecutar el archivo por lotes, extraerá cada archivo jar en el directorio. Lo único aquí es que se extraerá en el mismo directorio donde se encuentra el archivo jar.
También puede usar Unzip, que es más rápido que jar (opción -l para imprimir contenido zip).
Por ejemplo, un pequeño script que hace más o menos lo que quieres:
#!/bin/bash
for i in $(find . -name "*.jar")
do
if [ -f $i ]
then
echo $i
unzip -l $i | grep $*
fi
done
También puedes usar la opción -exec
de buscar
find . -name "*.jar" -exec jar tf {} /;
-n 1
pasar -n 1
a xargs
para forzarlo a ejecutar un comando jar
separado para cada nombre de archivo que obtiene de find
:
find -name "*.jar" | xargs -n 1 jar tf
De lo contrario, la línea de comando de jar tf file1.jar file2.jar...
parece a jar tf file1.jar file2.jar...
, que tiene un significado diferente al que se pretende.
Una técnica de depuración útil es pegar el echo
antes del comando que ejecutará xargs
:
find -name "*.jar" | xargs echo jar tf
Esto imprimirá el comando jar
completo en lugar de ejecutarlo, para que pueda ver qué está mal con él.