I’m using Spring (3.0.5.RELEASE) to create & manage some beans and am getting some very bizarre runtime errors.
The first time I ran the code, I was using slf4j-api-1.5.11, and I got the error that is shown below. I did a quick perusing online, and it looks like the MessageFormatter.format(String,Object,Object) method was not added to SLF4J until version 1.6. So it was obvious to me that somewhere in my dependency graph I had some component (Spring, Camel, or a dozen other possibilities) depending on 1.6+ version of SLF4J.
I removed 1.5.11 from my build path and replaced it with 1.6.2, and re-built. Still getting the same error. I’ve check the class file in the 1.6.2 Jar and it definitely contains that method. I’ve checked my class path settings, my Ivy setting (which I am using for dependency management), and I’ve even try cleaning the project (Eclipse) and running from a clean state.
I was beginning to think that this might be an “Eclipse thing”. But I’m packaging this into a WAR and deploying to Tomcat; Eclipse has nothing to do with it.
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
Any ideas? Online searching hasn’t turned up any recommendations except the obvious (update the Jar). Thanks in advance!
Ran Ivy resolve in verbose mode. Turned out that I had a component deep inside my dependency graph that was causing Ivy to evict the latest version of SLF4J (1.6.2) and forced it to use the older version (1.5.11).
Moral of the story for Ivy newbies: if something doesn’t feel like its working right, run Ivy in verbose (
-v) mode.