Найти класс где-то внутри десятков JAR-файлов? - PullRequest
227 голосов
/ 27 августа 2009

Как бы вы нашли конкретное имя класса во множестве jar-файлов?

(ищет фактическое имя класса, а не классы, которые ссылаются на него.)

Ответы [ 34 ]

2 голосов
/ 27 июня 2013

A bash script решение с использованием unzip (zipinfo). Проверено на Ubuntu 12.

#!/bin/bash

# ./jarwalker.sh "/a/Starting/Path" "aClassName"

IFS=$'\n'
jars=( $( find -P "$1" -type f -name "*.jar" ) )

for jar in ${jars[*]}
    do
        classes=( $( zipinfo -1 ${jar} | awk -F '/' '{print $NF}' | grep .class | awk -F '.' '{print $1}' ) )
        if [ ${#classes[*]} -ge 0 ]; then
            for class in ${classes[*]}
                do
                    if [ ${class} == "$2" ]; then
                        echo "Found in ${jar}"
                    fi
                done
        fi
    done
2 голосов
/ 04 июля 2016

Я нашел этот новый способ

bash $ ls -1  | xargs -i -t jar -tvf '{}'| grep Abstract
jar -tvf activation-1.1.jar
jar -tvf antisamy-1.4.3.jar
  2263 Thu Jan 13 21:38:10 IST 2011 org/owasp/validator/html/scan/AbstractAntiSamyScanner.class
...

Таким образом, здесь перечислены jar и класс, если он найден, если вы хотите, вы можете дать ls -1 * .jar или ввести xargs командой find HTH Someone.

1 голос
/ 31 марта 2011

Просто используйте утилиту FindClassInJars, это простая программа Swing, но полезная. Вы можете проверить исходный код или скачать JAR-файл на http://code.google.com/p/find-class-in-jars/

1 голос
/ 27 августа 2009

Check JBoss Tattletale ; хотя я никогда не использовал его лично, похоже, это инструмент, который вам нужен.

1 голос
/ 04 марта 2013

Не уверен, почему скрипты здесь никогда не работали для меня. Это работает:

#!/bin/bash
for i in *.jar; do jar -tf "$i" | grep $1 | xargs -I{} echo -e "$i : {}" ; done
1 голос
/ 07 июня 2013

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

ls *.jar | xargs grep -F MyClass

или, еще проще,

grep -F MyClass *.jar

Вывод выглядит так:

Binary file foo.jar matches

Это очень быстро, потому что опция -F означает поиск строки Fixed, поэтому она не загружает механизм регулярных выражений для каждого вызова grep. Если вам нужно, вы всегда можете опустить опцию -F и использовать регулярные выражения.

1 голос
/ 17 сентября 2013

Скрипт для поиска файла jar: find_jar.sh

IFS=$(echo -en "\n\b") # Set the field separator newline

for f in `find ${1} -iname *.jar`; do
  jar -tf ${f}| grep --color $2
  if [ $? == 0 ]; then
    echo -n "Match found: "
    echo -e "${f}\n"
  fi
done
unset IFS

Использование: ./find_jar.sh <каталог верхнего уровня, содержащий файлы jar> <Имя класса для поиска>

Это похоже на большинство ответов, приведенных здесь. Но он выводит только имя файла, если grep что-то находит. Если вы хотите подавить вывод grep, вы можете перенаправить его в / dev / null, но я предпочитаю также просматривать вывод grep, чтобы я мог использовать частичные имена классов и найти правильный из списка выводимых данных.

Имя класса может быть как простым именем класса, например «String», так и полностью определенным именем, например «java.lang.String»

1 голос
/ 19 июля 2013

Чтобы добавить еще один инструмент ... это очень простой и полезный инструмент для окон. Простой exe-файл, по которому вы щелкаете, дает ему каталог для поиска, имя класса, и он найдет jar-файл, содержащий этот класс. Да, это рекурсивно.

http://sourceforge.net/projects/jarfinder/

0 голосов
/ 30 ноября 2016

Если у вас есть экземпляр класса, или вы можете получить его, у вас есть чистое решение Java:

try{
    Class clazz = Class.forName("        try{
        Class clazz = Class.forName("class-name");
        String name = "/"+clazz.getName().replace('.', '/')+".class";
        URL url = clazz.getResource(name);
        String jar = url.toString().substring(10).replaceAll("!.*", "");
        System.out.println( jar );
    }catch(Exception err){
        err.printStackTrace();
    }

Конечно, первые две строки должны быть адаптированы в соответствии с тем, где у вас есть экземпляр класса или имя класса.

0 голосов
/ 27 августа 2009

Вы можете найти класс в директории, полной банок с небольшим количеством оболочки:

Ищем класс "FooBar":

LIB_DIR=/some/dir/full/of/jarfiles
for jarfile in $(find $LIBDIR -name "*.jar"); do
   echo "--------$jarfile---------------"
   jar -tvf $jarfile | grep FooBar
done
...