Мы потратили много времени на разработку нашей собственной системы ведения журналов (правильной или неправильной, именно так решили высокопоставленные лица!), И меня попросили написать собственную привязку SLF4J (реализация API), чтобы многие из наших Компоненты, использующие SLF4J (например, Apache Camel), начнут регистрироваться в нашей новой собственной системе.
Я следовал инструкциям на сайте SLF4J до буквы "T", создавая:
- A
StaticLoggerBinder
, который SLF4J использует во время выполнения для привязки к Loggers
и LoggerFactory
классам
- Адаптер логгера, который будет использоваться для "переадресации"
org.slf4j.Logger
вызовов на
- Фабрика логгеров (используется связывателем статических логгеров)
Все отлично компилируется. Я собираю его и добавляю в каталог lib
тестового проекта вместе с slf4j-api-1.6.2.jar
(версия, которую они хотят, чтобы я использовал). Я добавил оба JAR-файла в путь сборки в Eclipse.
Я создаю новую конфигурацию запуска для тестового проекта, и в области вкладок Classpath
конфигурации запуска я вижу, что она имеет User Entries >> TestBinding >> Slf4jBinding.jar and slf4j-api-1.6.2.jar
.
Итак, похоже, что оба JAR-файла находятся внутри пути к классу Run Configuration.
После запуска драйвера внутри проекта, который выглядит следующим образом:
public static void main(String[] args) {
Logger logger = LoggerFactory.getLogger(TestDriver.class);
logger.error("Test");
}
Я получаю следующие ошибки времени выполнения:
SLF4J: Не удалось загрузить класс "org.slf4j.impl.StaticLoggerBinder".
SLF4J: по умолчанию реализация логгера без операций (NOP)
SLF4J: Подробнее см. http://www.slf4j.org/codes.html#StaticLoggerBinder.
Переходя на этот ссылочный сайт, кажется, что SLF4J не может найти мой StaticLoggerBinder
на пути к классам, который находится внутри Slf4jBinding.jar
, хотя и не на корневом уровне JAR.
Я посмотрел на исходный файл SLF4J LoggerFactory.java
и нашел код, который выдает такую ошибку:
private final static void bind() {
try {
// the next line does the binding
StaticLoggerBinder.getSingleton();
INITIALIZATION_STATE = SUCCESSFUL_INITILIZATION;
emitSubstituteLoggerWarning();
} catch (NoClassDefFoundError ncde) {
String msg = ncde.getMessage();
if (messageContainsOrgSlf4jImplStaticLoggerBinder(msg)) {
INITIALIZATION_STATE = NOP_FALLBACK_INITILIZATION;
Util
.report("Failed to load class \"org.slf4j.impl.StaticLoggerBinder\".");
Util.report("Defaulting to no-operation (NOP) logger implementation");
Util.report("See " + NO_STATICLOGGERBINDER_URL
+ " for further details.");
} // ...
Очевидно, что вызов в верхней части блока try
(StaticLoggerBinder.getSingleton()
) выбрасывает NoClassDefFoundError
. Я просто не понимаю, почему.
Я решил не вставлять свой код здесь, потому что я думаю, что это просто проблема с classpath. Правильно ли мой код придерживается политики связывания SLF4J, пока неизвестно, пока я не смогу обойти эту проблему.
Есть ли дополнительный шаг, который мне нужно предпринять в Eclipse для настройки пути к классам? Может ли мой Slf4jBinding.jar
нуждаться в StaticLoggerBinder
внутри его корня по какой-то причине? У меня нет идей здесь. Заранее спасибо!