Несовместимость каркаса - PullRequest
109 голосов
/ 19 августа 2010

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

так что мое приложение может войти через logback через 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)

Я пробовал все более и более низкие номера версий на некоторых из этих jar-файлов, а также копался в документации API и т. Д., Но я не могу найти и решить проблему.

Помогите, пожалуйста?

Несмотря на то, что logback считается «стратегической» структурой ведения журнала, у меня есть некоторая свобода в выборе механизма ведения журнала. Тем не менее, я надеюсь использовать logback или log4j, и я определенно хочу объединить ведение журнала старого проекта с любой «новой» средой ведения журнала с помощью общей конфигурации.

Ответы [ 3 ]

111 голосов
/ 20 августа 2010

Вы смешиваете версию 1.5.6 моста jcl с версией 1.6.0 slf4j-api; это не будет работать из-за нескольких изменений в 1.6.0. Используйте одинаковые версии для обоих, то есть 1.6.1 (последняя версия). Я постоянно использую мост jcl-over-slf4j, и он отлично работает.

41 голосов
/ 16 апреля 2011

SLF4J версии 1.5.11 и 1.6.0 несовместимы (см. отчет о совместимости ), поскольку список аргументов метода org.slf4j.spi.LocationAwareLogger.log был изменен (добавлен Object [] 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 .

enter image description here

23 голосов
/ 01 декабря 2010

Просто чтобы помочь тем, кто в подобной ситуации со мной ...

Это может быть вызвано тем, что зависимая библиотека случайно установила старую версию 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>
...