2016-02-18 3 views
2

Есть ли способ определить во время выполнения, из которого загружен определенный класс?Определение того, где определенный класс загружен из

Мы используем сервер приложений, который имеет несколько мест для размещения внешних библиотек. Теперь возникает проблема, что, например, несколько разных версий библиотеки apache-commons помещаются в разные места, и никто не может фактически сказать, какой из этих JAR-файлов является источником в определенном Java-классе.

Есть ли способ спросить загрузчика классов, где он действительно загружал класс? Какой конкретный JAR-файл?

ответ

4

Эта информация хранится в классах ProtectionDomain. Вы можете получить доступ к защитному домену класса с помощью:

Object o = new Object(); 
ProtectionDomain protection = o.getClass().getProtectionDomain(); 

Внутри этого объекта, есть метод, называемый getCodeSource(), который возвращает CodeSource, который содержит URL-адрес местоположения она пришла:

URL loadedFile = protection.getCodeSource().getLocation(); 

Этот URL-адрес может быть пустым, если загрузчик классов не предоставил эту информацию во время загрузки.

1

Я бы предпочел использовать Подробный класс loading для диагностики проблем с загрузкой классов. Он может быть включен с использованием -verbose:class в качестве аргумента JVM. Это печатает классы при загрузке, включая имена файлов в jar.

Некоторые вопросы, связанные с этим: Java verbose class loading

1

Другим способом найти где класс загружается из (без манипуляций с источником) является запуск Java VM с помощью опции: -verbose:class.

Смежные вопросы