Несумісність фреймворків журналів


109

Я будую невеликий додаток Java і сподіваюся використовувати для зворотного зв'язку журнал.

У моєму додатку залежить залежність від старого проекту, який здійснює реєстрацію через нього

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, або log4j, і я, безумовно, хочу об'єднати вхід старого проекту в те, що в "новій" рамці ведення журналу закінчується за допомогою загальної конфігурації.

Відповіді:


111

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


2
Це працювало відразу, звичайно; дуже тобі дякую! Я не використовував 1.6.1 цих банок, оскільки вони, здається, не були доступні. Я сильно роздратований m2eclipse, який ніби показує мені всі доступні версії, але загадково скидає значну кількість їх.
Карл Смотрич

1
Тільки для зацікавлення когось іншого, що слідує: я опинився з червоною стрілкою на графіку залежності, тому що навіть останній сервер для зворотного зв'язку наполягає на slf4j-1.6.0. Потрібно було ще кілька дидлінгу з версіями, поки всі червоні стрілки не зникли, але зараз це працює і всі сині стрілки.
Карл Смотрич

1
Як саме я це роблю.
користувач1721803

Дякую ... Використання 'jcl-over-slf4j' врятувало мені день.
Тарік М Насім

41

Версії 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 .

введіть тут опис зображення


23

Просто, щоб допомогти тим, хто перебуває в подібній ситуації до мене ...

Це може бути викликано, коли залежна бібліотека випадково зв’язала стару версію slf4j. У моєму випадку це був тика-0,8. Дивіться https://isissue.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>

Дякую! Мене це вразило при спробі використання Jackrabbit 2.2.5 зі SLF4J 1.6.1 та Logback 0.9.28!
Хенді Іраван

Дякую. Я посилався
Хенді
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.