ClassNotFoundException: org.springframework.web.context.ContextLoaderListener
使用maven2 和 tomcat6 在eclipse wtp上开发基于Spring2.5+Struts2的web应用程序。启动tomcat的时候报错:
2012-11-17 11:11:34 org.apache.catalina.core.StandardContext listenerStart
严重: Error configuring application listener of class org.springframework.web.context.ContextLoaderListener
java.lang.ClassNotFoundException: org.springframework.web.context.ContextLoaderListener
at org.apache.catalina.loader.WebappClassLoader.loadClass(WebappClassLoader.java:1680)
at org.apache.catalina.loader.WebappClassLoader.loadClass(WebappClassLoader.java:1526)
at org.apache.catalina.core.StandardContext.listenerStart(StandardContext.java:4148)
at org.apache.catalina.core.StandardContext.start(StandardContext.java:4704)
at org.apache.catalina.core.ContainerBase.start(ContainerBase.java:1053)
at org.apache.catalina.core.StandardHost.start(StandardHost.java:840)
at org.apache.catalina.core.ContainerBase.start(ContainerBase.java:1053)
at org.apache.catalina.core.StandardEngine.start(StandardEngine.java:463)
at org.apache.catalina.core.StandardService.start(StandardService.java:525)
at org.apache.catalina.core.StandardServer.start(StandardServer.java:754)
at org.apache.catalina.startup.Catalina.start(Catalina.java:595)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
at java.lang.reflect.Method.invoke(Method.java:597)
at org.apache.catalina.startup.Bootstrap.start(Bootstrap.java:289)
at org.apache.catalina.startup.Bootstrap.main(Bootstrap.java:414)
报错的后果是Spring没有加载bean容器的配置文件。致使server无法启动。
经过仔细的对比,我发现项目下的.classpath与正常的不一样,我的是这样的:
<classpathentry kind="con" path="org.maven.ide.eclipse.MAVEN2_CLASSPATH_CONTAINER"/>
正常的是这样的:
<classpathentry kind="con" path="org.maven.ide.eclipse.MAVEN2_CLASSPATH_CONTAINER">
<attributes>
<attribute name="org.eclipse.jst.component.dependency" value="/WEB-INF/lib"/>
</attributes>
</classpathentry>
差别就在这个classpathentry下的attributes里了。没有找到对这个配置的直接说明。不过可以分析下这个问题。显然这个entry是为maven2的classpath准备的,显然/WEB-INF/lib不属于maven2的类路径,因此可以得出结论这是临时给Maven2的类路径加了一写jar。谁需要这些jar呢,从org.eclipse.jst.component.dependency这个名字来看,应该是eclipse的一个插件需要。
因此可以进一步推测,这个web应用在部署时,maven会把所有相关的jar包拷贝到WEB-INF的lib下,就和普通的WEB应用一样。如果没有个attributes,maven插件就不会把这些jarcopy过去。这样WTP运行时,lib目录是空的,就会导致class not found的意外。
不过这只是推测,具体情况有待进一步考证。