2012-04-26 3 views
30

Мое приложение построено на Java EE.Как искать строку в JAR-файлах

У меня примерно 50 банок в этом приложении.

Возможно ли найти конкретное ключевое слово (на самом деле я хочу найти ключевое слово BEGIN REQUEST)?

+0

Надеюсь, что это помогает -> http://www.unix.com/unix-dummies-questions-answers/39683-find-string-jar-file.html учитывая вашу ОС Linux. удачи !! –

+0

Вы пытаетесь сделать это во время выполнения или как часть отладки проблемы? –

+0

Что значит «ключевое слово»? Файлы Jar состоят из классов Java, которые содержат идентификаторы и строки (и другое содержимое). Вы хотите найти классы, которые определяют или используют строку «BEGIN REQUEST»? –

ответ

69

Вы можете использовать zipgrep на Linux,

zipgrep "BEGIN REQUEST" file.jar 

Если у вас есть, чтобы найти то же самое в ряде кувшинов, сделать

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

где LIBDIR является каталогом, содержащий все банки. Команда также будет рекурсивно искать подкаталоги.

Для окон, вы можете скачать Cygwin и установить zipgrep под ним http://www.cygwin.com/

Edit 1

Чтобы просмотреть имя файла, который был найден вы могли бы сделать выражение,

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

+2

Вы также можете запустить звук с помощью zipgrep на OSX, и выше все работает отлично. Очень ценится парень! – reevesy

+0

Сохраненный мой день, спасибо @kal! –

+0

Есть ли способ, которым я могу перечислить, из какой банки вытекает каждая строка? – Bee

0

Приведенная ниже команда показывает результаты с именем файла и именем файла jar.

  1. Чтобы найти строку в списке файлов jar.

    find <%PATH of the Folder where you need to search%> -name "*.jar" -print -exec zipgrep "jar$|<%STRING THAT YOU NEED TO FIND>" '{}' \; 
    
  2. Чтобы найти имя класса в списке файлов jar.

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

Поиск в банке или найти имя класса, который содержит определенный текст очень легко с поиском WinRar. Он эффективен и всегда работал для меня по крайней мере.

просто откройте любую банку в WinRar, нажмите «..», пока не дойдете до верхней папки, откуда вы хотите начать поиск (включая подпапки).

Обязательно проверьте следующие параметры:

1.) Предоставить «*» в «имена файлов, чтобы найти» полей,

2.) находку Установите флажки»«типы архивов»в подпапках ',' найти в файлах ',' найти в архивах '.

3

Осторожно: Это не точный ответ, это всего лишь быстрый эвристический подход. Если вам нужно найти что-то вроде имени класса (например, какой jar имеет класс Foo?) Или, может быть, имя метода, это может сработать.

grep --text 'your string' your.jar 

Это будет искать файл в банке, как если бы это был текст. Это быстрее, потому что он не расширяет архив, но это также почему он менее точен.Если вам нужно быть исчерпывающим, то это не тот подход, который вы должны использовать, но если вы хотите попробовать что-то немного быстрее, прежде чем вытащить zipgrep, это хороший подход.


С man grep,

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

Fastjar - очень старый, но соответствует вашим потребностям. Fastjar содержит инструмент jargrep (или grepjar). Используется так же, как 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

Использование jfind баночки

JFind может найти файл Java класса где-нибудь в файловой системе, даже если она спрятана много уровней глубоко в баночке в ухе в пределах zip!

http://jfind.sourceforge.net/

Смежные вопросы