Эквивалент команды which для поиска ресурса (ов) на пути к классам Java - PullRequest
1 голос
/ 22 февраля 2012

Есть ли эквивалент UNIX команды «which», то есть для данного ресурса (ов), пройти через все компоненты classpath и сказать, в каком компоненте (ах) он находится? В частности, когда на пути к классам есть несколько вхождений?

(Контекст: я только что провел большую часть дня в погоне за ошибкой, которая сводилась к очень длинному пути к классам, имеющему исходный каталог с устаревшим исходным кодом, предшествующий (и, следовательно, затмевающий) скомпилированному jar с скомпилированным более новым кодом.)

(Да, я знаю, что вы можете получить это с 'java -verbose' , но это дает тонны продукции.

Может быть 'java -verbose ... | grep SpecificResource ' - это лучший способ?)

Ответы [ 3 ]

2 голосов
/ 22 февраля 2012

См. jwhich , я считаю, что это именно то, что вы ищете. Нетрудно свернуть свой собственный, но зачем это делать, когда он легко доступен?

1 голос
/ 22 февраля 2012

Я использую сценарий оболочки для поиска классов в наборе JAR. Соответствующая часть это:

find /my/jars -name \*.jar | while read jar; do
    jar -tf "$jar" | fgrep --label="$jar" -l foo/bar/SomeClass.class
done

, в котором перечислены все файлы JAR в /my/jars, содержащие файл foo/bar/SomeClass.class.

Редактировать

Этот однострочный из комментариев тоже работает:

grep -rail --include=\*.jar foo/bar/SomeClass.class /my/jars
0 голосов
/ 22 февраля 2012

Лучше всего взять ваш путь к классам и найти каждый элемент для соответствующего класса (классов).

Теоретически классы гарантированно загружаются в порядке пути к классам.Если ваш путь к классу имеет подстановочный элемент, он больше не является детерминированным.Поэтому вам нужно проверить их и просто выбросить элементы classpath, которые соответствуют рассматриваемому ресурсу.

Короткий скрипт JRuby / Groovy должен сделать это, если java -verbose не предоставит вам всю информациютебе нужно.

...