Java SLF4J API的NoSuchMethodError
与slf4j一起使用时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
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)
分辨率:
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,