log4j e o classloader de contexto do thread

Sou novato em Java e comecei a descobrir o conceito de carregadores de classes. Agora eu estou tendo alguns problemas com log4j sobre o uso do classloader de contexto de thread.

Estou recebendo os seguintes erros: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".

Meu aplicativo funciona mais ou menos assim: no init, o URLClassLoader # 1 é construído e carrega algumas classes, essas classes usam o log4j. Mais tarde URLClassLoader # 2 é construído (que tem URLClassLoader # 1 como pai) e carrega mais algumas classes, essas classes também usam log4j. Quando o URLClassLoader # 2 é usado para carregar essas classes, a mensagem de erro acima é exibida (há mais algumas com o mesmo problema).

A solução atual que fiz foi definir o carregador de classes de contexto do thread atual para URLClassLoader # 2 antes de carregar as classes problemáticas e redefini-las para a antiga depois:

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

Enquanto isso funciona, não tenho certeza se é a abordagem correta.

Qualquer insight sobre este assunto será apreciado. Além disso, por que o log4j está me forçando a mexer com o classloader do contexto do thread? Por que não me deixar passar em um carregador de classes (e usar um padrão quando não o fizer) em vez de usar o do segmento?

questionAnswers(1)

yourAnswerToTheQuestion