27

当与 slf4j 一起使用时,

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

跟踪如下

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

8 回答 8

46

看起来您在各种 SLF4J API 和集成库之间存在版本不匹配。SLF4J 在版本兼容性方面非常棘手(例如 1.6.x 不向后兼容 1.5.x)。

确保各种 JAR 版本匹配,并确保类路径上没有重复的 JAR。

于 2011-03-29T22:49:54.347 回答
9

我收到了这个错误:

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

现在我刚刚用 pom.xml 中的版本注释了行,如下所示,它现在正在工作:

    <dependency> 
      <groupId>org.slf4j</groupId>
      <artifactId>slf4j-log4j12</artifactId>
      <!-- <version>1.6.5</version> -->
    </dependency>
于 2012-06-21T11:23:10.620 回答
1

还要确保您是否在外部(而非本地)部署 Glassfish,以删除该服务器上 Glassfish 安装的 lib 文件夹中的重复依赖项。

就我而言,一切都在本地运行良好,但一旦部署在服务器上,我就收到了这个错误。

于 2013-10-11T10:39:04.007 回答
0

看起来您的 MessageFormatter 类的版本与 JDK14LoggerAdapter 类的版本不同。控制你的类路径。

于 2011-03-29T22:50:16.010 回答
0

我预计这是因为版本不兼容,例如(如果您正在运行应用程序 6.0 并持有一个 jar 文件(slf4j 1.5)或同时持有一个 jar 文件(slf4j 1.5 和 1.6)),那么可能会引发异常。

建议选择正确的版本不要在构建路径中放置多个版本文件(slf4f 1.5 和 slf4j 1.6)文件,删除相应的文件

然后运行确定,你会得到它。

于 2012-06-15T06:56:13.017 回答
0

就我而言,我们在各种 SLF4J API 和集成库之间进行了正确的版本匹配。但我们也在使用tika-appjar,其中也包含 SLF4J 类。

要检查您是否还有一些包含 SLF4J 类的 (fat)jar,在 Unix 系统上:

转到您的 WEB-INF/lib/ 目录并运行以下命令

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

这将在控制台上打印所有 jar 的匹配结果。

最后,我们用tika-appjar 替换了tika-corejar。

于 2018-07-26T05:40:45.470 回答
0

在我的例子中,我在部署一个 EAR 文件到JBoss EAP 5.2时遇到了同样的“ java.lang.NoSuchMethodError ” 。

日志显示:

SLF4J:您的 slf4j 绑定请求的版本 1.5.6 与 [1.6] 不兼容

日志:(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  

问题:

问题是类路径上有两个不同版本的 slf4j-api jar。(slf4j-log4j12-1.5.6.jar, slf4j-api-1.6.1.jar)

解析度:

  1. 我运行“mvn dependency:tree”来找到传递依赖的位置。
  2. 然后,我添加了一个 maven 排除标记来排除不需要的工件版本。
<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>
于 2018-11-08T23:10:43.470 回答
0

我在使用 Spark 应用程序时遇到了同样的问题。这是不同版本混合时引起的。

我们应该使用这样的东西:

 "org.slf4j" % "slf4j-log4j12" % "1.7.30" % Test,
 "org.slf4j" % "slf4j-api" % "1.7.30" % Test,
于 2020-10-27T17:24:42.520 回答