Класс загрузки NoClassDefFoundError с URLClassLoader - PullRequest
0 голосов
/ 29 июня 2018

Мы пытаемся поддерживать плагины для нашего продукта, и я использую отражение для загрузки класса из jar.

Я создаю URL ClassLoader и добавляю все банки зависимостей в качестве URL.

Я использую этот ClassLaoder для загрузки основного класса плагина.

Я получаю экземпляр класса и ссылку на метод (метод run ()).

Когда я вызываю метод, я получаю следующее исключение:

java.lang.NoClassDefFoundError: Не удалось инициализировать класс org.apache.logging.log4j.util.PropertiesUtil

Этот класс находится в log4j-api-2.10.0.jar, который включен в путь к классам ClassLoader.

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

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

Основной класс, который загружается отражением, вызывает второй класс, который использует Log4j 2.

Когда метод run () первичного класса пытается создать экземпляр 2-го класса, где возникает эта проблема.

В любом классе, кроме Logger, нет ничего статичного.

В отладчике по методу ref я вижу, что класс действительно был загружен созданным нами URL ClassLoader.

Этот код работает в течение десятилетия, и единственное, что мы изменили, - это обновление до Log4j 2 в плагине. Класс, выполняющий загрузку отражающего плагина, является обычным классом в пути к классам приложения.

Любая помощь будет принята с благодарностью.

Получив предложение от Морось, я получаю:

Exception in thread "ServerStatus:update_timer:" java.lang.ExceptionInInitializerErrorException in thread "ServerStatus:update_timer:" java.lang.ExceptionInInitializerError
    at java.lang.Class.forName0(Native Method)  at java.lang.Class.forName0(Native Method)
    at java.lang.Class.forName(Unknown Source)  at java.lang.Class.forName(Unknown Source)
    at ...
    at java.lang.Thread.run(Unknown Source) at java.lang.Thread.run(Unknown Source)
Caused by: java.lang.ClassCastException: java.util.Vector cannot be cast to java.lang.StringCaused by: java.lang.ClassCastException: java.util.Vector cannot be cast to java.lang.String
    at org.apache.logging.log4j.util.SystemPropertiesPropertySource.forEach(SystemPropertiesPropertySource.java:39)
    at org.apache.logging.log4j.util.SystemPropertiesPropertySource.forEach(SystemPropertiesPropertySource.java:39)
    at org.apache.logging.log4j.util.PropertiesUtil$Environment.reload(PropertiesUtil.java:330) at org.apache.logging.log4j.util.PropertiesUtil$Environment.reload(PropertiesUtil.java:330)
    at org.apache.logging.log4j.util.PropertiesUtil$Environment.<init>(PropertiesUtil.java:322) at org.apache.logging.log4j.util.PropertiesUtil$Environment.<init>(PropertiesUtil.java:322)
    at org.apache.logging.log4j.util.PropertiesUtil$Environment.<init>(PropertiesUtil.java:310) at org.apache.logging.log4j.util.PropertiesUtil$Environment.<init>(PropertiesUtil.java:310)
    at org.apache.logging.log4j.util.PropertiesUtil.<init>(PropertiesUtil.java:69)  at org.apache.logging.log4j.util.PropertiesUtil.<init>(PropertiesUtil.java:69)
    at org.apache.logging.log4j.util.PropertiesUtil.<clinit>(PropertiesUtil.java:49)    at org.apache.logging.log4j.util.PropertiesUtil.<clinit>(PropertiesUtil.java:49)

Обновление: в Log4j 2 версии 2.10.x и более поздних есть ошибки. Загрузка классов рефлексивно выявляет ошибки. Переключение обратно на 2.8.2 и вышеприведенное исключение исчезает. Тем не менее, теперь я получаю ClassNotFound для одного из моих классов, все же.

Ответы [ 2 ]

0 голосов
/ 30 июня 2018

Резервное копирование Log4j до 2.8.2 решена проблема. Это ошибка на Log4j. Спасибо за помощь. Человека, которого было трудно найти.

0 голосов
/ 29 июня 2018

это может быть полезно для разрешения java.lang.NoClassDefFoundError

try {
    Class.forName("org.apache.logging.log4j.util.PropertiesUtil");
} catch (Exception e) {
    e.printStackTrace();
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...