Подтвердить что ты не робот

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

Я использую slf4j 1.6.2 api jar (попробовал также использовать 1.6.1) - версия журнала - 0.9.29 (ядро и классика). Я использую 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]"
4b9b3361

Ответ 1

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

Ответ 2

Версия 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 vs. binding, она выдаст предупреждение о предполагаемом несоответствии.

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

Ответ 3

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

  <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>

Ответ 4

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

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

NoSuchMethodError связано с обнаружением методов с одним и тем же именем более одного раза, вероятно, из разных версий тех же банок

Ответ 5

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

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

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

    <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

Ответ 6

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

Ответ 7

Это может быть больше "меня тоже", но я попытаюсь наметить более полное решение. Я смешиваю много программного обеспечения из разных источников вместе в своем продукте. Сначала я столкнулся с этой проблемой с NiFi JAR, а затем с JARs 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)

Тогда я сказал Maven, что я хотел Cassandra без всякого приключения в 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, который не соответствовал тому, что, по-видимому, использовало Cassandra (0.9-то вроде вас). Таким образом, я исключил возможность получения журнала, добавив эти исключения в 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>

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