log4j и контекст потока classloader

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

Я получаю следующие ошибки: 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".

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

Текущее обходное решение, которое я сделал, должно было установить контекст текущего потока classloader на 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 вынуждает меня смешать с контекстом потока classloader? Почему бы не позволять мне передать в загрузчике класса (и использовать по умолчанию, когда я не делаю) вместо того, чтобы использовать один потока?

13
задан duffymo 29 December 2009 в 14:29
поделиться

1 ответ

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

.
15
ответ дан 2 December 2019 в 00:18
поделиться
Другие вопросы по тегам:

Похожие вопросы: