Log4j и поток-загрузчик классов потоков

Я новичок в Java и только начинаю понимать концепцию загрузчиков классов. Прямо сейчас у меня возникают некоторые проблемы с log4j в отношении использования потокового загрузчика классов.

Я получаю следующие ошибки: A "org.apache.log4j.ConsoleAppender" object is not assignable to a "org.apache.log4j.Appender" variable. The class "org.apache.log4j.Appender" was loaded by [[email protected]] whereas object of type "org.apache.log4j.ConsoleAppender" was loaded by [[email protected]]. Could not instantiate appender named "CONSOLE".

Мое приложение работает примерно так: при инициализации URLClassLoader # 1 создается и загружает некоторые классы, эти классы используют log4j. Позже создается URLClassLoader # 2 (который имеет URLClassLoader # 1 как родительский) и загружает еще несколько классов, эти классы также используют log4j. Когда URLClassLoader # 2 используется для загрузки этих классов, появляется вышеуказанное сообщение об ошибке (есть еще одна проблема с той же проблемой).

Текущее обходное решение, которое я делал, - установить текущую загрузку класса контекста потока в URLClassLoader # 2 перед загрузкой проблемных классов и сбросить его до старого:

ClassLoader urlClassLoader; // this is URLClassLoader #2
Thread thread = Thread.currentThread();
ClassLoader loader = thread.getContextClassLoader();
thread.setContextClassLoader(urlClassLoader);
try {
  urlClassLoader.loadClass(...)
} finally {
  thread.setContextClassLoader(loader);
}

Пока это работает, я не уверен, правильно ли он подходит.

Любое понимание этого вопроса будет оценено по достоинству. Кроме того, почему log4j заставляет меня возиться с потоковым загрузчиком классов классов? Почему бы не позволить мне пройти загрузчик классов (и использовать по умолчанию один, когда я этого не делаю) вместо того, чтобы использовать один поток?

Ответ 1

Похоже, вы столкнулись с серьезной проблемой с log4j (и библиотекой журнала Apache Commons), а именно, что они имеют смехотворно трудное время, обнаруживая и взаимодействуя с правильными загрузчиками классов, когда они используются. Здесь очень плотное объяснение, полное примеров, здесь; сообщение о приеме на родину заключается в том, что одной из основных движущих сил новой структуры ведения журналов SLF4J было полное устранение этих проблем. Возможно, вы захотите поменять его и посмотреть, облегчена ли ваша жизнь.