调试奇怪的Spring/SLF4J/Jar问题



我使用Spring (3.0.5.RELEASE)创建&管理一些bean,我得到一些非常奇怪的运行时错误。

第一次运行代码时,我使用的是slf4j-api-1.5.11,我得到了如下所示的错误。我在网上快速浏览了一下,看起来MessageFormatter.format(String,Object,Object)方法直到1.6版本才添加到SLF4J中。所以很明显,在我的依赖关系图的某个地方,我有一些组件(Spring, Camel,或其他十几种可能性)依赖于1.6+版本的SLF4J。

我从我的构建路径中删除了1.5.11,并用1.6.2代替它,并重新构建。还是得到相同的错误。我已经检查了1.6.2 Jar中的类文件,它肯定包含该方法。我检查了我的类路径设置,我的Ivy设置(我正在使用依赖管理),我甚至尝试清理项目(Eclipse)并从一个干净的状态运行。

我开始认为这可能是"Eclipse的事情"。但是我将它打包成WAR并部署到Tomcat;与Eclipse无关。

SEVERE: 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 'messagehandler' defined in ServletContext resource [/WEB-INF/spring-config.xml]: Instantiation of bean failed; nested exception is org.springframework.beans.BeanInstantiationException: Could not instantiate bean class [com.tms.relay.web.RelayWebIngestMessageHandler]: Constructor threw exception; nested exception is java.lang.NoSuchMethodError: org.slf4j.helpers.MessageFormatter.format(Ljava/lang/String;Ljava/lang/Object;Ljava/lang/Object;)Lorg/slf4j/helpers/FormattingTuple

任何想法?在线搜索没有出现任何建议,除了明显的(更新Jar)。提前感谢!

我会尝试如下:

(1)解包WAR并确保其内容是您所期望的。特别是检查SLF4J JAR文件。

(2)检查完WAR后,删除Tomcat打开WAR文件的目录,并重新启动Tomcat。这应该会导致Tomcat重新部署应用程序。这种方法不太可能有帮助,但我建议尽早排除这种可能性。

(3)在Tomcat的特殊目录——$CATALINA_HOME/lib、shared/lib和/或shared/classes中检查旧版本的JAR。关于Tomcat的类路径的更多细节可以在这里找到。关于Tomcat 7的特别信息可以在这里和那里找到。

它可能是有用的,知道你在什么操作系统。另外,Tomcat是如何安装的,从那以后您定制了什么(例如启动脚本)?

在详细模式下运行Ivy解析。原来,我的依赖关系图深处有一个组件,它导致Ivy退出最新版本的SLF4J(1.6.2),并迫使它使用旧版本(1.5.11)。

对于Ivy新手的故事寓意:如果有些东西感觉不正常,请以冗长(-v)模式运行Ivy

最新更新