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


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

например," com.компания IBM.в WebSphere.безопасность.автор.WSSubject", как вы отследите соответствующий файл jar? ("google" - это не тот ответ, который я ищу!)

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

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

17 62

17 ответов:

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

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

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

$ findclass.sh . WSSubject

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

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

нет никакого "официального" языка Java способ сделать это, насколько мне известно.

способ, которым я обычно охочусь за ним, - это использовать найти и 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.

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

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

чтобы найти все банки в текущем каталоге и вернуть один (ы), которые содержат класс a.b.c.d do 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

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

или

или

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

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

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

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

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

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

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

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

например

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

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

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

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

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

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

найти .jar / xargs grep com.компания IBM.в WebSphere.безопасность.автор.WSSubject

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

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

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

alt text

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

alt text

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

#!/usr/bin/env bash

if [[ ($# -ne 1) && ($# -ne 2) ]]
then
    echo "usage is  <grep RegEx to look for in contents of jar> [<top-of-folder-hierarchy> or, if missing, current dir]"
else
    REG_EXP=
    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