JarScan, сканировать все файлы JAR во всех подпапках для определенного класса

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

Ответ 1

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

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, найденных в текущем каталоге

Ответ 2

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

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

Тогда вы точно узнаете, откуда оно взялось.

Ответ 3

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

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

Ответ 4

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

Ответ 5

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

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

Ответ 6

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

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

Ответ 7

Вы также можете посмотреть инструмент Java JarScan.

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

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

Ответ 8

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