SSH整合后部署到Tomcat服务器的jar包的报错问题解决方法
在SSH整合后,部署到Tomcat服务器上,启动Tomcat,启动过程Tomcat服务器会抛出异常如下:
“严重: Error configuring application listener of class org.springframework.web.context.ContextLoaderListener
java.lang.ClassNotFoundException: org.springframework.web.context.ContextLoaderListener...”
分析:首先从这个异常可以看出,ClassNotFoundException,没有找到指定的类"org.springframework.web.context.ContextLoaderListener",这个类是spring整合jar中的类,
在spring-web包中,所以,首先确定自己是否导入该jar包:
如图所示,导入jar包的两种方式:上面箭头指向的方式是将spring-3.2.web作为一个User Library直接导入到项目当中,而下面箭头指向的方式是直接把对应包放到WEB-INF/lib文件夹下再导入的方式,这两种方式任意一种都可以,但推荐上面的方式。
如果检查后发现jar包已确实导入,那么可能的情况就是项目在部署到Tomcat服务器中时,没有把相关的jar都加载到服务器中,所以打开Tomcat安装文件,找到部署项目的文件夹下,查看jar是否存在,地址同样是项目的WEB-INF/lib下。
如果确实没有jar包,则需要在eclipse当中配置,右键项目--->选择properties--->选择deployment assembly--->将自己定义的User Library添加进去,这样在部署项目时,eclipse会将选中的User Library的所有jar包复制到Tomcat的项目lib目录下,这样就可以加载了。
原理:造成这个问题的原因主要在java classloader,对于纯Java项目,不存在WEB-INF目录,所以在引入jar包的时候一般都是通过buildpath直接引入,例如我要引入Hibernate,那么先定义一个User Library,然后通过build path引入即可。纯java项目使用的本地自己的JRE,那么classLoader在加载jar和class时候是分开的,对于我们自己编写的class,会在APP_HOME/bin下。导入的jar包或者user library的配置信息会出现在APP_HOME/.classpath文件中,ClassLoader会很智能去加载这些classes和jar。
而对于Java Web项目,虽然eclipse的workspace中仍然有.classpath文件,但即使你导入的了自己定义的user library,它也不会出现在.classpath中。项目最终不是通过本地的JRE去运行,而是部署到web 服务器,如Tomcat、Weblogic、WebSphere等,这些服务器都实现了自身的类加载器。
以Tomcat典型结果为例,它的目录结构分别对应四个不同的类加载器,关系如下:
common --- CommonClassLoader
server --- CatalinaClassLoader
shared --- SharedClassLoader
webapps --- WebappClassLoader