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;