Подтвердить что ты не робот

Как искать строку в файлах JAR

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

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

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

4b9b3361

Ответ 1

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

zipgrep "BEGIN REQUEST" file.jar

Если вы хотите найти несколько банок, выполните

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

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

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

Изменить 1

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

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

Ответ 2

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

grep --text 'your string' your.jar

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


Из man grep,

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

Ответ 3

В Android я должен был искать как JAR и AAR файлы для определенной строки, которую я искал, вот моя реализация на Mac:

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

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

Ответ 4

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

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

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

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

2.) выберите флажки "найти в подпапках", "найти в файлах", "найти в архивах".

Ответ 5

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

  • Чтобы найти строку в списке файлов 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"
    

Ответ 6

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

Ответ 7

Использование jfind jar

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

http://jfind.sourceforge.net/

Ответ 8

Нашел скрипт ниже на alvinalexander.com. Это просто, но полезно для поиска по всем файлам jar в текущем каталоге

#!/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

Замените "codehaus..." вашим запросом, то есть именем класса.

Пример вывода:

$ ./searchjars.sh

Looking in ./activation-1.1.jar ...
Looking in ./commons-beanutils-1.7.0.jar ...
Looking in ./commons-codec-1.3.jar ...
Looking in ./commons-pool.jar ...
Looking in ./jaxen-1.1-beta-9.jar ...
Looking in ./jdom-1.0.jar ...
Looking in ./mail-1.4.jar ...
Looking in ./xbean-2.2.0.jar ...
Looking in ./xbean-spring-2.8.jar ...
Looking in ./xfire-aegis-1.2.6.jar ...
Looking in ./xfire-annotations-1.2.6.jar ...
Looking in ./xfire-core-1.2.6.jar ...
Looking in ./xfire-java5-1.2.6.jar ...
Looking in ./xfire-jaxws-1.2.6.jar ...
Looking in ./xfire-jsr181-api-1.0-M1.jar ...
Looking in ./xfire-spring-1.2.6.jar ...
==> Found "codehaus/xfire/spring" in ./xfire-spring-1.2.6.jar
Looking in ./XmlSchema-1.1.jar ...