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

我们的 web 应用都是部署到 webapps 目录下,而WebappClassLoader加载器专门负责加载 webapps 下所有web项目的 WEB-INF 下的类库和类文件。而我们通过 User Library 引入的 jar 包是不会被 WebappClassLoader 加载器加载,所以才会出现 ClassNotFoundException 。

 

 

posted @ 2018-09-13 10:28  ClubHouse  阅读(702)  评论(0编辑  收藏  举报