Найти файл JAR с именем класса? - PullRequest
62 голосов
/ 30 сентября 2009

Это, должно быть, очень простой вопрос для разработчиков Java, но как лучше всего найти подходящий файл jar с именем класса ?

Например, учитывая " com.ibm.websphere.security.auth.WSSubject ", как вы отследите соответствующий файл jar? ("Google" не тот ответ, который я ищу!)

Документы java не дают никаких намеков на файл jar, и, очевидно, имена файлов jar сами по себе не дают подсказки.

Должен быть «поиск локальных jar» или что-то вроде «автоматического разрешения зависимостей», трюк в мире java. В идеале, я ищу «официальный» способ сделать это. Я оказался на машине с Windows без Cygwin.

Ответы [ 17 ]

80 голосов
/ 30 сентября 2009

Сохраните это как findclass.sh (или как угодно), поместите его на свой путь и сделайте его исполняемым:

#!/bin/sh
find "$1" -name "*.jar" -exec sh -c 'jar -tf {}|grep -H --label {} '$2'' \;

Первый параметр - это каталог для рекурсивного поиска, а второй параметр - это регулярное выражение (обычно простое имя класса) для поиска.

$ findclass.sh . WSSubject

Скрипт использует опцию -t команды jar (которая перечисляет содержимое) и очищает каждую таблицу содержимого, помечая любые совпадения с путем к файлу JAR, в котором он был найден.

14 голосов
/ 01 июля 2011

Я написал программу для этого: https://github.com/javalite/jar-explorer Он также декомпилирует существующий байт-код, чтобы показать вам интерфейсы, методы, суперклассы, покажет содержимое других ресурсов - текста, изображений, HTML и т. Д.

12 голосов
/ 30 сентября 2009

Не существует "официального" Java-способа сделать это AFAIK.

Я обычно охотюсь за ним, используя find и jar , чтобы просмотреть все файлы jar в данном дереве.

> find . -name \*.jar -print -exec jar tf {} oracle/sql/BLOB.class \;
./v2.6.1/lib/csw_library.jar
./v2.6.1/lib/oracle_drivers_12_01.jar
oracle/sql/BLOB.class

Если вы работаете в Windows и не хотите устанавливать Cygwin, то, я полагаю, вам придется написать пакетный скрипт для поиска файлов jar.

5 голосов
/ 26 мая 2012

Чтобы найти все jar-файлы в текущем каталоге и вернуть те, которые содержат класс a.b.c.D, выполните a:

find . -iname *.jar | while read JARF; do jar tvf $JARF | grep a/b/c/D.class && echo $JARF ; done

Он сообщит обо всех экземплярах класса a.b.c.D (или классов с аналогичным суффиксом) и напечатает только те банки, которые его содержат.

Типичный выход:

$ find . -iname *.jar | while read JARF; do jar tvf $JARF | grep Log.class && echo $JARF ; done
479 Fri Oct 10 18:19:40 PDT 2003 org/apache/commons/logging/Log.class
3714 Fri Oct 10 18:19:40 PDT 2003 org/apache/commons/logging/impl/Log4JCategoryLog.class
1963 Fri Oct 10 18:19:40 PDT 2003 org/apache/commons/logging/impl/NoOpLog.class
9065 Fri Oct 10 18:19:40 PDT 2003 org/apache/commons/logging/impl/SimpleLog.class
./WebContent/WEB-INF/lib/commons-logging.jar
5 голосов
/ 02 декабря 2009

Если у grep в вашей системе (например, Solaris) нет -H и --label, как в примере с Дэном Дайером, вы можете использовать:

find . -name '*.jar' -type f | xargs -i bash -c "jar -tvf {}| tr / . | grep WSSubject && echo {}"
3 голосов
/ 30 сентября 2009

Вы можете попробовать такие услуги, как:

Или

или

  • Корпоративный репозиторий maven с функцией поиска, например, Nexus (OFC, это будет работать только в том случае, если искомые банки проиндексированы, т.е. установлены в хранилище)

PS: Jarhoo объединился с Javacio.us, чтобы предоставить 100 000 Java-разработчиков бесплатный доступ к Jarhoo по ссылкам, интегрированным в их результаты поиска Google. Подписка на Javacio.us бесплатна и открыта для всех, кто имеет аккаунт Google. Для получения дополнительной информации, пожалуйста, посетите страницу Jarhoo на Javacio.us .

3 голосов
/ 27 июля 2010

Попробуйте findjar.com. Если это в открытом доступе, вы должны получить его. Есть alos mavenjava.com (но этот сайт, кажется, не работает)

3 голосов
/ 01 октября 2009

В Windows запустите cmd.exe и введите:

  for %i in (*.jar) do @jar tvf %i | find "/com/company/MyClass.class"

Банки должны быть в текущем каталоге. For также имеет параметр / R, который берет каталог и позволяет выполнять рекурсивный поиск.

Если Jar.exe не на вашем пути, вы можете сделать что-то вроде @C: \ jdk \ bin \ jar.exe.

2 голосов
/ 30 сентября 2009

Печать списка на ходу, чтобы я мог видеть, что я проверяю. В основном я смотрю в каталоге lib / app, но вы можете заменить поиск для поиска.

например.

for jar in $(find some_dir/lib -name "*.jar" ); 
do
echo -------------$jar-------------------
jar -tf $jar | grep TheNameOfTheClassImLookingFor
done
1 голос
/ 24 апреля 2014

Существует также этот веб-сайт, который кажется полезным. http://www.findjar.com/

...