JarScan, просканируйте все файлы JAR во всех подпапках для определенного класса - PullRequest
9 голосов
/ 17 апреля 2009

Мы видим, что используется более старая версия класса, хотя у нас была развернута последняя версия. Как сканировать все файлы JAR во всех подпапках сервера приложений, как написать небольшой сценарий оболочки, который выводит имя файла JARS, в котором находится этот конкретный класс?

Ответы [ 8 ]

17 голосов
/ 17 апреля 2009

Что-то вроде:

find . -name '*.jar' | while read jarfile; do if jar tf "$jarfile" | grep org/jboss/Main; then echo "$jarfile"; fi; done

Вы можете обернуть это так:

jarscan() {
  pattern=$(echo $1 | tr . /)
  find . -name '*.jar' | while read jarfile; do if jar tf "$jarfile" | grep "$pattern"; then echo "$jarfile"; fi; done
}

И тогда jarscan org.jboss.Main будет искать этот класс во всех jar-файлах, найденных в текущем каталоге

4 голосов
/ 17 апреля 2009

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

System.err.println(YourClass.class.getProtectionDomain().getCodeSource());

Тогда ты точно будешь знать, откуда оно.

3 голосов
/ 18 мая 2009

Инструмент JAR Explorer довольно полезен.

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

2 голосов
/ 17 апреля 2009

Если вам нужен только результат, вы можете установить agentransack http://www.mythicsoft.com/agentransack/ и выполнить текстовый поиск. Agentransack также выполняет поиск в файлах jar и zip.

1 голос
/ 01 июня 2011
#! /bin/sh

path=$1
segment=$2

if [ -z "$path" ] || [ -z "$segment"  ]
then 
    echo "Usage: $0 <path> <segment>"
    exit
fi

for jar in $path/*.jar ; do echo " *** $jar *** " ; jar tf $jar| grep --color=always $segment; done;
1 голос
/ 21 сентября 2009

Вы также можете взглянуть на инструмент Java JarScan .

Можно искать по имени класса и по пакету.

Это очень помогает, когда Total Commander недоступен и разрешено выполнение только Java.

1 голос
/ 17 апреля 2009

Несколько лет назад я написал утилиту classfind для решения подобных проблем. Установите ваш classpath так, чтобы он указывал на ваш набор .jar, и classfind скажет вам, в каких jar-файлах он найдет определенный класс.

example% classfind -c Document
/usr/java/j2sdk1.4.0/jre/lib/rt.jar -> org.w3c.dom.Document
/usr/java/j2sdk1.4.0/jre/lib/rt.jar -> javax.swing.text.Document
1 голос
/ 17 апреля 2009

Теперь, чтобы ответить на этот вопрос, вот простая команда оболочки, которая сделала это для нас.

for jarFile in $(
    ls -R | 
    awk '
        match($0, ".*:") { 
            folder=$0 
        } 
        ! match($0, ".*:") {
            print folder$0 
        }' | 
        grep "\.jar" | 
        sed -e "s/:/\//g"
); 
do  
    unzip -l $jarFile; 
done | 
awk '
    match($0, "Archive.*") { 
        jar=$0 
    } 
    ! match($0, "Archive.*") {
        print jar" : "$0 
    }' | 
grep org.jboss.Main
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...