Исключение выдается при использовании logback/slf4j

Я использую slf4j 1.6.2 api jar (тоже пробовал использовать 1.6.1) - версия logback 0.9.29 (core & classic). Я использую JDK1.6 на Ubuntu. Полученное исключение копируется ниже.

Exception in thread "main" java.lang.NoSuchMethodError: org.slf4j.helpers.MessageFormatter.arrayFormat(Ljava/lang/String;[Ljava/lang/Object;)Lorg/slf4j/helpers/FormattingTuple;
    at ch.qos.logback.classic.spi.LoggingEvent.<init>(LoggingEvent.java:112)
    at ch.qos.logback.classic.Logger.buildLoggingEventAndAppend(Logger.java:471)
    at ch.qos.logback.classic.Logger.filterAndLog_0_Or3Plus(Logger.java:427)
    at ch.qos.logback.classic.Logger.info(Logger.java:631)

Я также получаю сообщение с жалобой на несоответствие привязки slf4j.

"SLF4J: The requested version 1.6 by your slf4j binding is not compatible with [1.5.5, 1.5.6, 1.5.7, 1.5.8, 1.5.9, 1.5.10, 1.5.11]"

7 ответов

Очень похоже, что версия slf4j-api.jar, загружаемая JVM, имеет версию 1.5.x. У вас наверняка есть slf4j-api-1.5.x.jar на вашем пути к классам (в дополнение к slf4j-api-1.6.2.jar). Проверьте свой путь к классу.

Добавление следующих зависимостей может помочь:

  <dependency>
      <groupId>org.slf4j</groupId>
      <artifactId>slf4j-api</artifactId>
      <version>1.7.7</version>
  </dependency>

  <dependency>
      <groupId>org.slf4j</groupId>
      <artifactId>jul-to-slf4j</artifactId>
      <version>1.7.7</version>
  </dependency>

  <dependency>
      <groupId>org.slf4j</groupId>
      <artifactId>jcl-over-slf4j</artifactId>
      <version>1.7.7</version>
  </dependency>

  <dependency>
      <groupId>org.slf4j</groupId>
      <artifactId>log4j-over-slf4j</artifactId>
      <version>1.7.7</version>
  </dependency>

  <dependency>
      <groupId>org.slf4j</groupId>
      <artifactId>slf4j-jdk14</artifactId>
      <version>1.7.7</version>
  </dependency>

Версия slf4j-api не соответствует версии привязки:

Привязка SLF4J обозначает артефакт, такой как slf4j-jdk14.jar или slf4j-log4j12.jar, используемый для привязки slf4j к базовой структуре ведения журнала, скажем, java.util.logging и, соответственно, log4j.

Смешивание разных версий slf4j-api.jar и SLF4J может вызвать проблемы. Например, если вы используете slf4j-api-1.7.2.jar, вам также следует использовать slf4j-simple-1.7.2.jar, использование slf4j-simple-1.5.5.jar не будет работать.

ПРИМЕЧАНИЕ. С точки зрения клиента все версии slf4j-api совместимы. Код клиента, скомпилированный с помощью slf4j-api-N.jar, будет отлично работать с slf4j-api-M.jar для любых N и M. Вам нужно только убедиться, что версия вашей привязки соответствует версии slf4j-api.jar. Вам не нужно беспокоиться о версии slf4j-api.jar, используемой данной зависимостью в вашем проекте. Вы всегда можете использовать любую версию slf4j-api.jar, и если версия slf4j-api.jar и его привязка совпадают, у вас все будет в порядке.

Во время инициализации, если SLF4J подозревает, что может быть проблема несовпадения версий API и привязки, он выдаст предупреждение о подозреваемом несовпадении.

Получил с http://www.slf4j.org/, я надеюсь, что это может помочь.

Кроме того, у вас должно быть много jar-версий slf4j-api версий, упомянутых в []. Попробуйте сохранить в classpath одну версию slf4j-api и соответствующие совместимые файлы jar slf4j-log4j.

Смешивание разных версий банок slf4j всегда будет проблематичным

NoSuchMethodError происходит из-за обнаружения методов с одним и тем же именем более одного раза, вероятно, из разных версий одних и тех же jar-файлов.

Мы должны согласовать версии slf4j-api и соответствующую привязку, в моем случае я использовал slf4j-log4j12 в соответствии с документацией SLF4J:

http://www.slf4j.org/codes.html

Я заменяю версии обеих библиотек, включенных в качестве транзитивных зависимостей, помещая в мой pom это:

    <dependency>
        <groupId>org.slf4j</groupId>
        <artifactId>slf4j-api</artifactId>
        <version>1.7.1</version>
    </dependency>

    <dependency>
        <groupId>org.slf4j</groupId>
        <artifactId>slf4j-log4j12</artifactId>
        <version>1.7.1</version>
    </dependency>

Я надеюсь, что это поможет кому-то.

С уважением,

Jaider

Скачать по ссылке ниже

https://jar-download.com/artifacts/ch.qos.logback/logback-classic/1.1.3/source-code

все три баночки совместимы друг с другом

У меня было точно такое же сообщение об ошибке. Я решил это, исключив зависимость org.apache.directory.server:apacheds-all, Каким-то образом эта банка переопределяет org.slf4j.spi.LocationAwareLogger

Это может быть больше "я тоже", но я постараюсь наметить более полное решение. Я смешал в своем продукте много программного обеспечения из разных источников. Я столкнулся с этой проблемой сначала с JAR-файлами NiFi, затем совсем недавно с JAR-файлами Cassandra. Я уже настаивал в pom.xml, что у меня везде одна и та же версия slf4j:

<slf4j.version>[1.7.25]</slf4j.version>
...
<dependency>
  <groupId>org.slf4j</groupId>
  <artifactId>slf4j-api</artifactId>
  <version>${slf4j.version}</version>
</dependency>
<dependency>
  <groupId>org.slf4j</groupId>
  <artifactId>slf4j-simple</artifactId>
  <version>${slf4j.version}</version>
</dependency>
... (all the slf4j JARs I needed)

Затем я сказал Мейвену, что хочу Кассандру без всего, что она принесла для slf4j:

<dependency>
  <groupId>org.apache.cassandra</groupId>
  <artifactId>cassandra-all</artifactId>
  <version>${cassandra.version}</version>
  <exclusions>
    <exclusion>
      <groupId>org.slf4j</groupId>
      <artifactId>slf4j-log4j12</artifactId>
    </exclusion>
    <exclusion>
      <groupId>org.slf4j</groupId>
      <artifactId>slf4j-simple</artifactId>
    </exclusion>
</dependency>

Однако, как и вы, я получал жалобы от

Exception in thread "main" java.lang.NoSuchMethodError: org.slf4j.helpers.MessageFormatter.arrayFormat(Ljava/lang/String;[Ljava/lang/Object;)Lorg/slf4j/helpers/FormattingTuple;
  at ch.qos.logback.classic.spi.LoggingEvent.<init>(LoggingEvent.java:112)

Из mvn dependency: tree я узнал, что получаю logback 1.1.3, который не соответствует тому, что, по-видимому, использует Кассандра (0.9 - что-то вроде вас). Итак, я исключил получение logback, добавив эти исключения к уже существующим slf4j:

<dependency>
  <groupId>org.apache.cassandra</groupId>
  <artifactId>cassandra-all</artifactId>
  <version>${cassandra.version}</version>
  <exclusions>
    <exclusion>
      <groupId>org.slf4j</groupId>
      <artifactId>slf4j-log4j12</artifactId>
    </exclusion>
    <exclusion>
      <groupId>org.slf4j</groupId>
      <artifactId>slf4j-simple</artifactId>
    </exclusion>
    <exclusion>
      <groupId>ch.qos.logback</groupId>
      <artifactId>logback-core</artifactId>
    </exclusion>
    <exclusion>
      <groupId>ch.qos.logback</groupId>
      <artifactId>logback-classic</artifactId>
    </exclusion>
</dependency>

... после чего проблема, с которой я столкнулся, и которую вы здесь сообщаете, ушла. Я надеюсь, что это помогает кому-то.

Другие вопросы по тегам