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的意外。

不过这只是推测,具体情况有待进一步考证。

posted @ 2012-11-17 21:18  永远是学生  阅读(2846)  评论(0编辑  收藏  举报