it-swarm.com.ru

Найти файл JAR с именем класса?

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

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

Java docs не дает никаких намеков на файл jar, и, очевидно, имена файлов jar сами по себе не дают подсказки.

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

62
Jeffrey Knight

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

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

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

$ findclass.sh . WSSubject

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

80
Dan Dyer

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

14
ipolevoy

Не существует "официального" 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.

12
Dave Costa

Чтобы найти все файлы в текущем каталоге и вернуть те, которые содержат класс 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
Marcus Junius Brutus

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

find . -name '*.jar' -type f | xargs -i bash -c "jar -tvf {}| tr / . | grep WSSubject && echo {}"
5
Stephen Muench

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

Или же

Или же

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

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

3
Pascal Thivent

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

3
Dan

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

3
Yishai

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

например.

for jar in $(find some_dir/lib -name "*.jar" ); 
do
echo -------------$jar-------------------
jar -tf $jar | grep TheNameOfTheClassImLookingFor
done
2
Steve B.

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

1
Ron Tuffin

В Windows PowerShell вы можете использовать эту команду. В нем перечислены все JAR-файлы, с которыми он сталкивается, но у него есть дополнительная строка, которую очень легко определить, где он также находит ваш класс.

Get-ChildItem -recurse -Filter *.jar | Foreach {echo $_.fullname; c:\somepath\JDK\BIN\jar tvf $_.fullname | Select-String -pattern "Cabbages.class"}
1
WoodenKitty

Я использую Ярскан . Это исполняемый файл JAR, который может рекурсивно искать всю структуру папок для JAR-файлов, которые содержат искомый класс. Он ищет по имени класса, имени пакета или регулярному выражению.

1
Mike Pone

Учитывая ваш комментарий о попытке обработки зависимостей, я бы сосредоточился на том, какие библиотеки вы используете. Зная это, вы будете знать, какие банки должны быть на пути к классам, и вы можете обратить на это внимание. Существуют также компоновщики управления зависимостями (Maven и Ant являются двумя популярными), которые могут упаковывать проекты с их зависимостями внутри. Однако, в конце концов, разработчик должен знать, какие у них зависимости, и обратить внимание на требования к этим зависимостям. Это одна из причин, по которой использование IDE, например Eclipse, и инструментов сборки, таких как Maven или Ant, настолько хороши в больших проектах, как если у вас есть 20 зависимостей для проекта, это может стать довольно неуправляемым.

1
aperkins

найти .jar | xargs grep com.ibm.websphere.security.auth.WSSubject

0
Paul Tomblin

Я рекомендую использовать Maven, Eclipse и m2Eclipse.

Шаг 1 - добавить определенный импорт

alt text

Шаг 2 - найти и скачать (автоматически) желаемую банку

alt text

0
cetnar

Основываясь на отличный ответ Дэна , следующий скрипт решает проблему искаженного вывода в случае, если некоторые из jar на самом деле являются неработающими символическими ссылками (но в то же время не пропускают правильные символические ссылки). Он также выполняет поиск в текущей каталог, если не указан аргумент.

#!/usr/bin/env bash

if [[ ($# -ne 1) && ($# -ne 2) ]]
then
    echo "usage is $0 <grep RegEx to look for in contents of jar> [<top-of-folder-hierarchy> or, if missing, current dir]"
else
    REG_EXP=$1
    DIR=${2:-.}
    if [ ! -d $DIR ]; then
        echo "directory [$DIR] does not exist";
        exit 1;
    fi
    find "$DIR" -name "*.jar" -exec sh -c '
    (test -e {})
    exitStatus=$?
    if [ "$exitStatus" -eq 0 ]; then # this is done to avoid broken symlinks
        jar -tf {}|grep -i -H --label {} '$REG_EXP'
    fi
' \;
fi
0
Marcus Junius Brutus

если вы все еще ищете WSSubject, то jar - это wssec.jar. Класс WSSecurityException внутри sas.jar

0
Som