Несовместимость фреймворков
Я создаю небольшое приложение Java и надеюсь использовать logback для ведения журнала.
Мое приложение имеет зависимость от более старого проекта, который выполняет его регистрацию через
org.apache.commons | com.springsource.org.apache.commons.logging | 1.1.1
... так что я планировал использовать
org.slf4j | jcl-over-slf4j | 1.5.6
... для перенаправления журнала JCL на
org.slf4j | slf4j-api | 1.6.0
... и, в конечном счете,
ch.qos.logback | logback-classic | 0.9.22
ch.qos.logback | logback-core | 0.9.22
поэтому мое приложение может регистрировать журнал через свой API slf4j, в то время как старый код библиотеки может войти в одно и то же место через перенаправление.
Увы, это приводит к
java.lang.NoSuchMethodError: org.slf4j.spi.LocationAwareLogger.log(Lorg/slf4j/Marker;Ljava/lang/String;ILjava/lang/String;Ljava/lang/Throwable;)V
at org.apache.commons.logging.impl.SLF4JLocationAwareLog.info(SLF4JLocationAwareLog.java:141)
Я пробовал более высокие и более низкие номера версий на некоторых из этих банок, а также копался через документацию по API и тому подобное... но я не могу найти и решить проблему.
Помогите, пожалуйста?
Хотя logback считается "стратегической" структурой ведения журнала, у меня есть некоторая свобода, в которой в конечном итоге используется механизм ведения журнала. Я бы надеялся использовать либо logback, либо log4j, и я определенно хочу объединить старый проект в том, что "новая" среда ведения журнала заканчивается тем, что используется в общей конфигурации.
Ответы
Ответ 1
Вы смешиваете версию моста jcl версии 1.5.6 с версией slf4j-api версии 1.6.0; это не сработает из-за нескольких изменений в 1.6.0. Используйте те же версии для обоих, то есть 1.6.1 (последний). Я все время использую мост jcl-over-slf4j, и он отлично работает.
Ответ 2
версии SLF4J 1.5.11 и 1.6.0 несовместимы (см. ), поскольку список аргументов метода org.slf4j.spi.LocationAwareLogger.log
имеет был изменен (добавлен объект [] p5):
SLF4J 1.5.11:
LocationAwareLogger.log ( org.slf4j.Marker p1, String p2, int p3,
String p4, Throwable p5 )
SLF4J 1.6.0:
LocationAwareLogger.log ( org.slf4j.Marker p1, String p2, int p3,
String p4, Object[] p5, Throwable p6 )
См. отчеты о совместимости для других версий SLF4J на этой странице.
Вы можете создавать такие отчеты с помощью japi-compliance-checker.
![введите описание изображения здесь]()
Ответ 3
Просто чтобы помочь тем, кто в подобной ситуации, мне самому...
Это может быть вызвано, когда зависимая библиотека случайно связала старую версию slf4j. В моем случае это был тика-0,8. См. https://issues.apache.org/jira/browse/TIKA-556
Работа вокруг - исключить компонент, а затем вручную зависеть от правильной или исправленной версии.
EG.
<dependency>
<groupId>org.apache.tika</groupId>
<artifactId>tika-parsers</artifactId>
<version>0.8</version>
<exclusions>
<exclusion>
<!-- NOTE: Version 4.2 has bundled slf4j -->
<groupId>edu.ucar</groupId>
<artifactId>netcdf</artifactId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<!-- Patched version 4.2-min does not bundle slf4j -->
<groupId>edu.ucar</groupId>
<artifactId>netcdf</artifactId>
<version>4.2-min</version>
</dependency>