it-swarm.com.de

Ausnahme bei Verwendung von logback/slf4j

Ich verwende slf4j 1.6.2 api jar (auch mit 1.6.1 versucht) - die Logback-Version ist 0.9.29 (Core & Classic). Ich verwende jdk1.6 auf Ubuntu. Die Ausnahme, die ich erhalten habe, wird unten kopiert.

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)

Ich bekomme auch eine Nachricht, die sich über das Nichtübereinstimmen der Bindung von slf4j beschwert. 

"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]"
17
haider

Es sieht ganz so aus, als ob die Version von slf4j-api.jar, die von der JVM geladen wird, die Version 1.5.x hat. Sie haben sicherlich slf4j-api-1.5.x.jar in Ihrem Klassenpfad (zusätzlich zu slf4j-api-1.6.2.jar). Überprüfen Sie Ihren Klassenpfad.

25
Ceki

Das Hinzufügen der folgenden Abhängigkeiten kann hilfreich sein:

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

die Version von slf4j-api stimmt nicht mit der der Bindung überein:

Eine SLF4J-Bindung bezeichnet ein Artefakt wie slf4j-jdk14.jar oder slf4j-log4j12.jar, mit dem slf4j an ein zugrunde liegendes Protokollierungsframework gebunden wird, beispielsweise Java.util.logging und log4j.

Das Mischen verschiedener Versionen von slf4j-api.jar und SLF4J-Bindung kann zu Problemen führen. Wenn Sie beispielsweise slf4j-api-1.7.2.jar verwenden, sollten Sie auch slf4j-simple-1.7.2.jar verwenden. Die Verwendung von slf4j-simple-1.5.5.jar funktioniert jedoch nicht.

HINWEIS Aus Sicht des Clients sind alle Versionen von slf4j-api kompatibel. Client-Code, der mit slf4j-api-N.jar kompiliert wurde, funktioniert mit slf4j-api-M.jar für jedes N und M einwandfrei. Sie müssen lediglich sicherstellen, dass die Version Ihrer Bindung derjenigen von slf4j-api.jar entspricht. Sie müssen sich nicht um die Version von slf4j-api.jar kümmern, die von einer bestimmten Abhängigkeit in Ihrem Projekt verwendet wird. Sie können jederzeit eine beliebige Version von slf4j-api.jar verwenden. Solange die Version von slf4j-api.jar und ihre Bindung übereinstimmen, sollten Sie in Ordnung sein.

Wenn SLF4J bei der Initialisierung den Verdacht hat, dass ein Versionsproblem zwischen einer API-Version und einer Bindungsversion vorliegt, wird eine Warnung bezüglich des vermuteten Versagens ausgegeben.

Ich habe von http://www.slf4j.org , ich hoffe es kann helfen.

8
itro

Außerdem müssen Sie über viele slf4j-api-Gläser verfügen, die in [] erwähnt werden. Versuchen Sie, eine einzige Version von slf4j-api und die entsprechenden kompatiblen slf4j-log4j -Jars im Klassenpfad zu speichern.

Das Mischen verschiedener Versionen von slf4j-Gläsern wird immer lästig sein

NoSuchMethodError beruht auf der mehrmaligen Erkennung von Methods-with-same-name, die wahrscheinlich aus den verschiedenen Versionen derselben Jars stammt

1
Arun GK

Wir müssen die Versionen von slf4j-api und die entsprechende Bindung anpassen. In meinem Fall habe ich slf4j-log4j12 entsprechend der Dokumentation von SLF4J verwendet:

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

Ich ersetze die Versionen der beiden Bibliotheken, die als transitive Abhängigkeiten enthalten sind, und füge dies in mein Pom ein:

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

Ich hoffe das hilft jemandem.

Mit freundlichen Grüßen,

Jaider

1
user7009301

Ich hatte genau die gleiche Fehlermeldung. Ich habe es gelöst, indem ich die Abhängigkeit org.Apache.directory.server:apacheds-all ausschließe. Irgendwie überschreibt das Glas org.slf4j.spi.LocationAwareLogger

0
jvwilge

Dies kann mehr "Ich auch" sein, aber ich werde versuchen, eine vollständigere Lösung zu finden. Ich mische eine Menge Software aus verschiedenen Quellen in meinem Produkt. Dieses Problem trat zuerst bei NiFi-JARs auf, später bei Cassandra-JARs. Ich hatte bereits in pom.xml darauf bestanden, dass ich überall dieselbe Version von slf4j habe:

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

Dann sagte ich zu Maven, ich wollte Cassandra ohne was auch immer es für slf4j bringen würde:

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

Wie auch ich bekam ich Beschwerden von mir

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)

Aus mvn Dependency: tree habe ich herausgefunden, dass ich Logback 1.1.3 erhielt, das nicht mit dem übereinstimmt, was Cassandra anscheinend verwendet (0,9 - so wie Sie). Also habe ich auch das Logback ausgeschlossen, indem ich diese Ausschlüsse zu den bereits vorhandenen slf4j hinzugefügt habe:

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

... woraufhin das Problem, das ich hatte und Sie hier berichten, verschwunden ist. Ich hoffe das hilft jemandem.

0
Russ Bateman