使用SLF4J API的NoSuchMethodError

当与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。

我收到了这个错误:

 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中的版本,如下所示,它现在正在运行:

   org.slf4j slf4j-log4j12   

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

在我的情况下,一切都在本地工作正常,但一旦部署在服务器上我得到了这个错误。

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

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

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

然后确定,你会得到它。

就我而言,我们在各种SLF4J API和集成库之间具有正确的版本匹配。 但是我们也在使用tika-app jar,它也包含SLF4J类。

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

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

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

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

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