JarScan, просканируйте все файлы JAR во всех подпапках для определенного класса
Мы видим, что используется более старая версия класса, хотя у нас была развернута последняя версия. Как сканировать все файлы JAR во всех подпапках сервера приложений, как мы пишем небольшой сценарий оболочки, который выводит имя файла JARS, в котором находится этот конкретный класс?
8 ответов
Что-то вроде:
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-файлах, найденных в текущем каталоге
Непосредственно не отвечая на ваш вопрос, но, возможно, это решит вашу проблему: вы можете распечатать местоположение (например, файл jar), из которого был загружен определенный класс, добавив простую строку в ваш код:
System.err.println(YourClass.class.getProtectionDomain().getCodeSource());
Тогда ты точно будешь знать, откуда это.
Инструмент JAR Explorer довольно полезен.
Это открывает окно GUI с двумя панелями. Вы можете выбрать каталог, инструмент будет сканировать все файлы JAR в этом каталоге, а затем позволит вам найти определенный класс. Затем загорается нижняя панель со списком совпадений для этого класса во всех отсканированных файлах JAR.
Если вам нужен только результат, вы можете установить agentransack http://www.mythicsoft.com/agentransack/ и выполнить поиск по тексту. Agentransack выполняет поиск внутри файлов jar и zip.
#! /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;
Несколько лет назад я написал утилиту 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
Вы также можете взглянуть на инструмент Java JarScan.
Можно искать по имени класса и по пакету.
Это очень помогает, когда Total Commander недоступен и разрешено выполнение только Java.
Теперь, чтобы ответить на этот вопрос, это простая команда оболочки, которая сделала это для нас.
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