2012-04-26 76 views
30

Mi aplicación está basada en Java EE.Cómo buscar una cadena en archivos JAR

Tengo aproximadamente 50 jarras en esta aplicación.

¿Es posible buscar una palabra clave en particular (en realidad quiero buscar una palabra clave BEGIN REQUEST)?

+0

Esperanza esto ayuda -> http://www.unix.com/unix-dummies-questions-answers/39683-find-string-jar-file.html teniendo en cuenta su sistema operativo es Linux. buena suerte !! –

+0

¿Está intentando hacer esto en tiempo de ejecución o como parte de la depuración de un problema? –

+0

¿Qué quiere decir con "palabra clave"? Los archivos Jar constan de clases Java, que contienen identificadores y cadenas (y otro contenido). ¿Desea buscar clases que definan o utilicen una cadena "BEGIN REQUEST"? –

Respuesta

69

Usted puede utilizar zipgrep en Linux,

zipgrep "BEGIN REQUEST" file.jar 

Si usted tiene que encontrar lo mismo en número de frascos, hacer

find libdir -name "*.jar" -exec zipgrep "BEGIN REQUEST" '{}' \; 

donde libdir es un directorio que contiene todos los frascos. El comando buscará recursivamente subdirectorios también.

Para las ventanas, se puede descargar cygwin e instalar zipgrep debajo de ella http://www.cygwin.com/

Editar 1

Para ver el nombre del archivo que se encontró la expresión que podría hacer,

find libdir | xargs -I{} sh -c 'echo searhing in "{}"; zipgrep "BEGIN REQUEST" {}'

+2

También puedes rockout con zipgrep en OSX y lo anterior funciona perfectamente. ¡Mucho apreciado! – reevesy

+0

Me salvó el día, gracias @kal! –

+0

¿Hay alguna manera de enumerar de qué jar proviene cada línea? – Bee

0

El siguiente comando muestra los resultados con el nombre del archivo y el nombre del archivo jar.

  1. Para encontrar la cadena en la lista del archivo jar.

    find <%PATH of the Folder where you need to search%> -name "*.jar" -print -exec zipgrep "jar$|<%STRING THAT YOU NEED TO FIND>" '{}' \; 
    
  2. Para encontrar el nombre de clase en la lista de archivos jar.

    find . -name "*.jar" -print -exec jar tvf {} \; |grep -E "jar$|<%CLASS NAME THAT YOU NEED TO FIND>\.class" 
    
0

la búsqueda dentro de un frasco o encontrar el nombre de la clase que contiene un texto en particular es muy fácil con la búsqueda WinRar. Es eficiente y siempre funcionó para mí al menos.

acaba de abrir cualquier jar en WinRar, haga clic en ".." hasta llegar a la carpeta superior desde donde desea iniciar la búsqueda (incluidas las subcarpetas).

Asegúrese de comprobar las siguientes opciones:

1.) proporcionan '*' 'en los nombres de archivo para encontrar' campos,

2.) a encontrar seleccionar casillas de verificación ' 'Tipos de archivo' en subcarpetas ',' buscar en archivos ',' buscar en archivos '.

3

Precaución: Esta no es una respuesta precisa, solo es un enfoque heurístico rápido. Si necesita encontrar algo como el nombre de una clase (p. Ej., ¿Qué jar tiene clase Foo?) O tal vez un nombre de método, entonces esto puede funcionar.

grep --text 'your string' your.jar 

Esto buscará el archivo jar como si fuera texto. Esto es más rápido porque no expande el archivo, pero también es por eso que es menos preciso.Si necesita ser exhaustivo, este no es el enfoque que debe utilizar, pero si desea probar algo un poco más rápido antes de sacar zipgrep, este es un buen enfoque.


De man grep,

-a, --text 
      Process a binary file as if it were text; this is equivalent 
      to the --binary-files=text option. 
0

Fastjar - muy viejo, pero sus necesidades. Fastjar contiene una herramienta llamada jargrep (o grepjar). Se utiliza la misma forma que grep:

> locate .jar | grep hibernate | xargs grepjar -n 'objectToSQLString' 

org/hibernate/type/EnumType.class:646:objectToSQLString 
org/hibernate/sql/Update.class:576:objectToSQLString 
org/hibernate/sql/Insert.class:410:objectToSQLString 
org/hibernate/usertype/EnhancedUserType.class:22:objectToSQLString 
org/hibernate/persister/entity/SingleTableEntityPersister.class:2713:objectToSQLString 
org/hibernate/hql/classic/WhereParser.class:1910:objectToSQLString 
org/hibernate/hql/ast/tree/JavaConstantNode.class:344:objectToSQLString 
org/hibernate/hql/ast/tree/BooleanLiteralNode.class:240:objectToSQLString 
org/hibernate/hql/ast/util/LiteralProcessor.class:1363:objectToSQLString 
org/hibernate/type/BigIntegerType.class:114:objectToSQLString 
org/hibernate/type/ShortType.class:189:objectToSQLString 
org/hibernate/type/TimeType.class:307:objectToSQLString 
org/hibernate/type/CharacterType.class:210:objectToSQLString 
org/hibernate/type/BooleanType.class:180:objectToSQLString 
org/hibernate/type/StringType.class:166:objectToSQLString 
org/hibernate/type/NumericBooleanType.class:128:objectToSQLString 
org/hibernate/type/CustomType.class:543:objectToSQLString 
org/hibernate/type/TimeZoneType.class:204:objectToSQLString 
org/hibernate/type/DateType.class:343:objectToSQLString 
org/hibernate/type/LiteralType.class:18:objectToSQLString 
org/hibernate/type/ByteType.class:189:objectToSQLString 
org/hibernate/type/LocaleType.class:259:objectToSQLString 
org/hibernate/type/CharBooleanType.class:171:objectToSQLString 
org/hibernate/type/TimestampType.class:409:objectToSQLString 
org/hibernate/type/CurrencyType.class:256:objectToSQLString 
org/hibernate/type/AbstractCharArrayType.class:219:objectToSQLString 
org/hibernate/type/FloatType.class:177:objectToSQLString 
org/hibernate/type/DoubleType.class:173:objectToSQLString 
org/hibernate/type/LongType.class:223:objectToSQLString 
org/hibernate/type/IntegerType.class:188:objectToSQLString 
0

Usando frasco jfind

JFind puede encontrar un archivo de clase Java en cualquier parte del sistema de archivos, incluso si se oculta muchos niveles de profundidad en un frasco dentro de una oreja dentro de un zip!

http://jfind.sourceforge.net/

Cuestiones relacionadas