Java SLF4J API的NoSuchMethodError

Java SLF4J API的NoSuchMethodError,java,slf4j,Java,Slf4j,与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.JDK14LoggerAdapte

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

看起来各种SLF4J API和集成库之间的版本不匹配。SLF4J在版本兼容性方面极不稳定(例如1.6.x与1.5.x不向后兼容)


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

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

我认为这是因为不兼容的版本,例如(如果您运行应用程序6.0并持有jar文件(slf4j 1.5)或同时持有两者(slf4j 1.5和1.6)),则可能引发异常

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


然后运行“确定”,您将得到它。

我遇到了以下错误:

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>

org.slf4j
slf4j-log4j12

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


在我的例子中,一切都在本地正常工作,但一旦部署到服务器上,我就出现了这个错误。

在我的例子中,我们在各种SLF4J API和集成库之间有正确的版本匹配。但我们也在使用
tika-app
jar,其中还封装了SLF4J类

要检查在Unix系统上是否也有包含SLF4J类的(fat)jar,请执行以下操作:

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

用于*.jar中的i;dojar-tvf“$i”| grep-Hsi消息格式化程序和echo“$i”;完成

这将打印控制台上所有JAR的匹配结果


最后,我们用
tika-core
jar替换了
tika-app
jar。

在我的例子中,我得到了相同的“java.lang.NoSuchMethodError”将EAR文件部署到JBoss EAP 5.2

日志显示:

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

日志:(server.log)

问题:

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

分辨率:

  • 我运行了“mvn依赖项:树”来查找可传递依赖项的位置
  • 然后,我添加了一个maven排除标记来排除不需要的工件版本
  • 
    org.slf4j
    slf4j-log4j12
    1.5.6
    org.slf4j
    slf4j api
    
    我在Spark应用程序中遇到了同样的问题。 这是由于不同的版本混合在一起造成的

    我们应该使用这样的方法:

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

    我也有类似的问题,但当我将sl4j、sl4j-log4j版本与我的1.7.5进行匹配时,它运行良好。这也解决了我的问题。如果您正在处理外部Java应用程序服务器上的老式Web服务,您可以尝试检查应用程序服务器的日志,以了解它将接受的slf4j绑定版本的建议。例如,catalina.out告诉我,我需要在1.6.x或1.7.x范围内提供一个slf4j绑定jar。你能猜出当你没有提供版本号时会出现什么错误吗?
     "org.slf4j" % "slf4j-log4j12" % "1.7.30" % Test,
     "org.slf4j" % "slf4j-api" % "1.7.30" % Test,