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

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

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

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

В java-мире должны быть "локальные локаторы поиска" или какие-то "зависящие от автозамены", трюки. В идеале я ищу "официальный" способ сделать это. Я оказался на машине с Windows без cygwin.

Ответ 1

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

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

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

$ findclass.sh . WSSubject

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

Ответ 2

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

Ответ 3

Нет никакого "официального" 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, то, полагаю, вам придется написать пакетный пакет script, чтобы найти файлы jar.

Ответ 4

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

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

Ответ 5

Для поиска всех банок под текущим каталогом и возврата тех, которые содержат класс a.b.c.D, выполните следующие действия:

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

Ответ 6

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

Или

Или

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

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

Ответ 7

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

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

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

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

Ответ 8

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

Ответ 9

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

например.

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

Ответ 10

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

Ответ 11

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

Ответ 12

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

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

Ответ 14

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

Ответ 15

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

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

alt text

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

alt text

Ответ 16

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

Ответ 17

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

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