Определите путь к файлу класса, который не удалось загрузить - PullRequest
0 голосов
/ 28 мая 2018

Мы получаем UnsupportedClassVersionError, но у нас возникают проблемы с определением местоположения файла-нарушителя (> 15 файлов JAR в пути к классам, некоторые из которых могут содержать определенный класс).Мы подозреваем, что один и тот же класс может быть в пути к классу несколько раз.

Параметр Java -verbose:class печатает именно то, что нам нужно, но только для успешно загруженных классов.Класс (файл), который вызывает ошибку, не печатается.

Как определить физическое местоположение файла класса (наиболее вероятного в JAR), который вызывает ошибку загрузчика классов?

Я думал, что можно установить точку останова в ClassLoader, но все соответствующие методы native.

Ответы [ 2 ]

0 голосов
/ 28 мая 2018

Загрузчики классов Java, которые вообще используют путь к классам, ищут его в порядке и используют (или пытаются) первое определение, которое они находят для любого данного класса, который они пытаются загрузить.В частности, не имеет значения, какой класс Java первым обнаруживает, чтобы потребовать вашего класса проблемы.Эти загрузчики классов выполняют одинаковый поиск пути для каждого класса, который они пытаются загрузить.

Скорее всего, имя класса - особенно его пакет - даст вам представление о том, какие файлы jar проверять, но вы этого не делаетедействительно нужно это.Самое простое и надежное решение - сделать так, как это делает Java: проверять каждый jar-файл в том порядке, в котором он указан в пути к классам.

Вы можете перечислить содержимое jar с помощью jar -tf myjar.jar.Если вы ищете org.other.SomeClass, оно будет отображаться в банке как /org/other/SomeClass.class.

0 голосов
/ 28 мая 2018

Я бы сделал что-то вроде следующего:

log.info(ClassLoader.getSystemResource("com/acme/MyClass.class"));

Для класса com.acme.MyClass.

...