Несовместимость фреймворков

Я создаю небольшое приложение 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>