Вопрос по java – Как искать строку в JAR-файлах

39

Мое приложение построено на Java EE.

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

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

Вы пытаетесь сделать это во время выполнения или как часть отладки проблемы? Kalpak Gadre
Что значит "ключевое слово"? Файлы Jar состоят из классов Java, которые содержат идентификаторы и строки (и другой контент). Хотите найти классы, которые определяют или используют строку "BEGIN REQUEST"? Alexei Kaigorodov
Надеюсь, это поможет -> Unix.com / Unix-манекены-вопросы-ответы / ... учитывая, что твоя ОС - это Linux. удачи ! Mithun Sasidharan

Ваш Ответ

7   ответов
88

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

zipgrep "BEGIN REQUEST" file.jar

Если тебе нужно найти одно и то же в количестве банок, сделай

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

where libdir - это каталог, содержащий все файлы jar. Команда также будет рекурсивно искать подкаталоги.

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

Редакция 1

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

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

Вы также можете использовать zipgrep для OSX, и все вышеперечисленное работает отлично. Очень ценится парень! reevesy
Спас мой день, спасибо @kal! Petro Semeniuk
@ Bhathiya обновил ответ командой для того же самого Kalpak Gadre
Есть ли способ, с помощью которого я могу перечислить, из какой банки происходит каждая строка? Bee
Спасибо за ответ. Bee
1

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

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

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

1.) Укажите '*' в полях 'имена файлов для поиска', 'Типы архивов'

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

4

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

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

Отman grep,

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

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

http: //jfind.sourceforge.net

1

строку, которую я искал, вот моя реализация на mac:

find . -name "*.jar" -o -name "*.aar" | xargs -I{} zipgrep "AssestManager" {}

essential находит все файлы jar и aar в текущем каталоге (и команда find по умолчанию рекурсивна) передает результаты в zipgrep и применяет каждое имя файла в качестве параметра через xargs. скобки в конце указывают xargs, куда поместить имя файла, которое вы получили из команды find. если вы хотите выполнить поиск по всему домашнему каталогу, просто измените поиск. найти ~

Это работает для печати имен файлов, но путь к файлам jar отсутствует, мы можем напечатать пути к файлам jar? kanaparthikiran
так что вы хотите, чтобы имя файла и банка, в котором он находится, печатались в одной строке. возможно, потребуется написать скрипт, чтобы сделать его чище. j2emanue
Это не сработало и не дало никаких результатов. kanaparthikiran
@ kanaparthikiran, это напечатает путь к файлу jarfind * -type f -name '*.jar' -exec grep -l 'Expression.class' '{}' \; ssasi
0

Fastjar - очень старый, но соответствует вашим потребностям. Fastjar содержит инструмент под названием jargrep (или grepjar). Используется так же, как и grep:

>  locate .
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

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

find <%PATH of the Folder where you need to search%> -name "*.jar" -print -exec zipgrep "jar$|<%STRING THAT YOU NEED TO FIND>" '{}' \;

Чтобы найти имя класса в списке файлов jar.

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

Похожие вопросы