Эквивалент jdeps для Java 7

Мне нужно проанализировать, какие классы используются (на которые ссылаются) разные .class файлы в банке. я знаю это

jdeps -v example.jar

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

3 ответа

Решение

Я смог получить, казалось бы, хорошие результаты с javap -c и фильтр регулярных выражений.

я использовал cygwin чтобы получить мои результаты, но вы должны быть в состоянии сделать это в любой среде, все, что вам нужно, это инструмент, чтобы расстегнуть молнию, javap и инструмент для выполнения регулярных выражений. В текущих версиях Windows, powershell обеспечит эти функции.

Следующий код перечислит классы, на которые ссылается каждый класс в файле jar:

mkdir workDir
unzip yourJar.jar -d workDir
shopt -s globstar
for classFile in **/*.class; do
    echo "Classes used in $classFile :"
    javap -c "$classFile" | grep -Eo "([a-zA-Z0-9]+/)+[A-Z][a-zA-Z0-9]*" | sort -u
    echo
done

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

mkdir workDir
unzip yourJar.jar -d workDir
shopt -s globstar
for classFile in **/*.class; do
    javap -c "$classFile" | grep -Eo "([a-zA-Z0-9]+/)+[A-Z][a-zA-Z0-9]*" 
done | sort -u

Обратите внимание, что при этом будут пропущены классы, которые не соответствуют соглашениям, например, которые определены в пакете по умолчанию или имя которых не начинается с заглавной буквы.

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

Альтернативное решение - положить JDK1.8 на доступный сетевой диск и вызвать jdeps там. Это работает, даже когда локальный JDK равен 1.7.

Используйте JD Java Decompiler ( http://jd.benow.ca/).

Другие вопросы по тегам