Мы пытаемся поддерживать плагины для нашего продукта, и я использую отражение для загрузки класса из 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 для одного из моих классов, все же.