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 [java.net.URLClassLoader@105691e] whereas object of type "org.apache.log4j.ConsoleAppender" was loaded by [sun.misc.Launcher$AppClassLoader@16930e2]. Could not instantiate appender named "CONSOLE".

Мое приложение работает примерно так: на init URLClassLoader # 1 создается и загружает некоторые классы, эти классы используют log4j. Позже URLClassLoader # 2 создается (который имеет URLClassLoader # 1, так какs parent) и загружает еще несколько классов, эти классы также используют 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)

Ваш ответ на вопрос