web-dev-qa-db-fra.com

Exception levée lors de l'utilisation de logback/slf4j

J'utilise slf4j 1.6.2 api jar (essayé d'utiliser 1.6.1 également) - la version de connexion est 0.9.29 (core & classic). J'utilise jdk1.6 sur Ubuntu. L'exception que j'ai reçue est copiée ci-dessous.

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)

Je reçois également un message pour me plaindre de l'inadéquation des liaisons entre 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]"
17
haider

Cela ressemble beaucoup à la version 1.5.x de la version de slf4j-api.jar chargée par la machine virtuelle Java. Vous avez sûrement slf4j-api-1.5.x.jar sur votre chemin de classe (en plus de slf4j-api-1.6.2.jar) Vérifiez votre chemin de classe.

25
Ceki

L'ajout des dépendances suivantes peut aider:

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

la version de slf4j-api ne correspond pas à celle de la liaison:

Une liaison SLF4J désigne un artefact tel que slf4j-jdk14.jar ou slf4j-log4j12.jar utilisé pour lier slf4j à une infrastructure de journalisation sous-jacente, par exemple Java.util.logging et respectivement log4j.

Le mélange de différentes versions de slf4j-api.jar et de SLF4J peut poser problème. Par exemple, si vous utilisez slf4j-api-1.7.2.jar, vous devez également utiliser slf4j-simple-1.7.2.jar, utiliser slf4j-simple-1.5.5.jar ne fonctionnera pas.

REMARQUE Du point de vue du client, toutes les versions de slf4j-api sont compatibles. Le code client compilé avec slf4j-api-N.jar fonctionnera parfaitement avec slf4j-api-M.jar pour tout N et M. Vous devez simplement vous assurer que la version de votre liaison correspond à celle de slf4j-api.jar. Vous n'avez pas à vous soucier de la version de slf4j-api.jar utilisée par une dépendance donnée dans votre projet. Vous pouvez toujours utiliser n'importe quelle version de slf4j-api.jar, et tant que la version de slf4j-api.jar et ses correspondances correspondent, tout devrait bien se passer.

Au moment de l'initialisation, si SLF4J soupçonne l'existence d'un problème d'appariement d'api par rapport à une version contraignante, il émettra un avertissement concernant l'inadéquation présumée.

Vous avez obtenu de http://www.slf4j.org , j'espère que cela pourra vous aider.

8
itro

De plus, vous devez disposer de nombreux fichiers jar slf4j-api des versions mentionnées dans le []. Essayez de conserver une version unique de slf4j-api et du fichier correspondant compatible slf4j-log4j jars dans le chemin d'accès aux classes.

_ {Mélanger différentes versions de fichiers jar de slf4j sera toujours gênant} _

La cause NoSuchMethodError est due à la découverte répétée de méthodes avec le même nom, provenant probablement des différentes versions des mêmes fichiers JAR.

1
Arun GK

Nous devons aligner les versions de slf4j-api et de la liaison correspondante. Dans mon cas, j’utilisais slf4j-log4j12, conformément à la documentation de SLF4J:

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

Je remplace les versions des deux bibliothèques incluses en tant que dépendances transitives, en mettant dans mon pom ceci:

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

J'espère que cette aide à quelqu'un.

Sincères amitiés,

Jaider

1
user7009301

J'ai eu exactement le même message d'erreur. Je l'ai résolu en excluant la dépendance org.Apache.directory.server:apacheds-all. D'une manière ou d'une autre, cette jar remplace org.slf4j.spi.LocationAwareLogger

0
jvwilge

Cela peut être plus "moi aussi", mais je vais essayer de présenter une solution plus complète. Je mélange beaucoup de logiciels provenant de sources diverses dans mon produit. J'ai rencontré ce problème d'abord avec les JAR NiFi, puis plus récemment avec les JAR de Cassandra. J'avais déjà insisté dans pom.xml pour avoir la même version de slf4j partout:

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

Ensuite, j'ai dit à Maven que je voulais Cassandra sans rien ce qu'elle rapportait pour 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>

Cependant, comme vous, je recevais des plaintes de

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)

De mvn dependency: tree , j’ai découvert que j’obtenais logback 1.1.3, ce qui ne correspondait pas à ce que Cassandra utilisait apparemment (quelque chose comme 0.9). Donc, j'ai aussi exclu l'obtention de la journalisation en ajoutant ces exclusions à celles de slf4j déjà présentes:

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

... sur quoi le problème que j’avais et que vous signalez ici est parti. J'espère que ça aidera quelqu'un.

0
Russ Bateman