user496949
user496949

Reputation: 86185

NoSuchMethodError with SLF4J API

When Use with slf4j,

String test = blahblahblah;
logger.info("{}",test);

Trace as below

java.lang.NoSuchMethodError: org.slf4j.helpers.MessageFormatter.format(Ljava/lang/String;Ljava/lang/Object;)Lorg/slf4j/helpers/FormattingTuple;

at org.slf4j.impl.JDK14LoggerAdapter.info(JDK14LoggerAdapter.java:304)

Upvotes: 28

Views: 64308

Answers (8)

Abhishek Sengupta
Abhishek Sengupta

Reputation: 3321

I faced the same problem with Spark Application. It is caused when different versions are mixed.

We should use something like this :

 "org.slf4j" % "slf4j-log4j12" % "1.7.30" % Test,
 "org.slf4j" % "slf4j-api" % "1.7.30" % Test,

Upvotes: 0

Peter Tarlos
Peter Tarlos

Reputation: 941

In my case, I was getting the same "java.lang.NoSuchMethodError" deploying an EAR file to JBoss EAP 5.2.

The logs showed:

SLF4J: The requested version 1.5.6 by your slf4j binding is not compatible with [1.6]

Logs: (server.log)

2018-11-05 09:59:46,382 ERROR [STDERR] (main) SLF4J: See http://www.slf4j.org/codes.html#multiple_bindings for an explanation.
2018-11-05 09:59:46,395 ERROR [STDERR] (main) SLF4J: The requested version 1.5.6 by your slf4j binding is not compatible with [1.6]
2018-11-05 09:59:46,395 ERROR [STDERR] (main) SLF4J: See http://www.slf4j.org/codes.html#version_mismatch for further details.
2018-11-05 09:59:46,402 ERROR [org.apache.catalina.core.ContainerBase.[jboss.web].[localhost].[/common-scheduling/services]] (main) Exception sending context initialized event to listener instance of class org.springframework.web.context.ContextLoaderListener
org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'org.springframework.validation.beanvalidation.LocalValidatorFactoryBean#0': Invocation of init method failed; nested exception is java.lang.NoSuchMethodError: org.slf4j.helpers.MessageFormatter.format(Ljava/lang/String;Ljava/lang/Object;)Ljava/lang/String;
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1512)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:521)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:458)
at org.springframework.beans.factory.support.AbstractBeanFactory$1.getObject(AbstractBeanFactory.java:296)
at  

Problem:

The problem was having two different versions of slf4j-api jars on the classpath. (slf4j-log4j12-1.5.6.jar, slf4j-api-1.6.1.jar)

Resolution:

  1. I ran "mvn dependency:tree" to find the location of the transitive dependency.
  2. Then, I added a maven exclusion tag to exclude the undesired artifact version.
<dependency>
  <groupId>org.slf4j</groupId>
  <artifactId>slf4j-log4j12</artifactId>
  <version>1.5.6</version>
  <exclusions>
    <exclusion>
      <groupId>org.slf4j</groupId>
      <artifactId>slf4j-api</artifactId>
    </exclusion>
  </exclusions>
</dependency>

Upvotes: 0

Bhushan
Bhushan

Reputation: 1547

In my case, we are having correct version match between the various SLF4J API and integration libraries. But we are also using tika-app jar, which also have SLF4J classes wrapped inside it.

To check if you are also having some (fat)jar which contains SLF4J classes, On Unix system:

Go to your WEB-INF/lib/ directory and run following command

for i in *.jar; do jar -tvf "$i" | grep -Hsi MessageFormatter && echo "$i"; done

This will print matching result from all jars on console.

Finally, we replaced tika-app jar by tika-core jar.

Upvotes: 0

Akshay Lokur
Akshay Lokur

Reputation: 7516

I was getting this error:

SLF4J: The requested version 1.6 by your slf4j binding is not compatible with [1.5.5, 1.5.6]
SLF4J: See http://www.slf4j.org/codes.html#version_mismatch for further details.
java.lang.NoSuchMethodError: org.slf4j.helpers.MessageFormatter.format(Ljava/lang/String;Ljava/lang/Object;)Lorg/slf4j/helpers/FormattingTuple;
.
.
.

Now I just commented line with version from pom.xml, as shown below, and it is working now:

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

Upvotes: 9

Eamir Z
Eamir Z

Reputation: 11

Also make sure if you deploy in Glassfish externally (not locally) to remove duplicate dependencies in the lib folder of the Glassfish installation on that server.

In my case, everything worked fine locally but once deployed on a server I got this error.

Upvotes: 1

muhammed Younus attari
muhammed Younus attari

Reputation: 381

I expect that this is because of uncompatible version, like (if you are running your application 6.0 and holding a jar file (slf4j 1.5) or holding both (slf4j 1.5 and 1.6)) then exception might raised.

suggestion is go for proper version dont place more than one version file (slf4f 1.5 and slf4j 1.6) file in the build path, delete the appropriate one

and

then run sure, you will get it.

Upvotes: 0

Paŭlo Ebermann
Paŭlo Ebermann

Reputation: 74800

This looks like you have a different version of the MessageFormatter class than your JDK14LoggerAdapter class. Control your classpath.

Upvotes: 0

skaffman
skaffman

Reputation: 403611

Looks like you have a version mis-match between the various SLF4J API and integration libraries. SLF4J is extremely twitchy when it comes to version compatibility (e.g. 1.6.x is not backwards compatible with 1.5.x).

Make sure the various JAR versions match, and make sure there are no duplicate JARs on the classpath.

Upvotes: 47

Related Questions