Hander processing failed; nested exception is java.lang.NoClassDefFoundError; javax/servlet/jsp/jstl/core/Config
【问题描述】
今天我将之前调试过的一个 web project 直接复制到另一个文件夹里面,原工程是没有问题的(至少可以正常运行)。然后,我将新路径下的工程import 到Myeclipse中并重新部署启动,正常启动,没有报错,但是,当我在通过浏览器登陆网页的时候却报错了。网页报错界面和后台报错信息如下:
【解决办法】
如图中绿线标记处,报错信息为:Hander processing failed; nested exception is java.lang.NoClassDefFoundError; javax/servlet/jsp/jstl/core/Config。
字面意思为:没有发现相关类的定义,后面的javax/servlet/jsp/jstl/core/Config表示所缺失的类库的路径(姑且这么理解)。根据这一提示,既然缺失相关类库,我们首先搞清楚这个类库是什么,根据报错信息javax/servlet/jsp/jstl,工程中缺少的是Jsp标准标签库JSTT,相关内容链接里面有。于是,我在工程的Referenced Libraries中找到了包含标签的jar包:com.springsource.org.apache.taglibs.standard-1.1.2,我发现其中确实缺少javax/servlet/jsp/jstl相关的类包,鉴于我所建立的web工程采用的是Spring 框架,于是,我在Spring框架给定的类包中找到了定义标准标签库的另一个类包:com.springsource.javax.servlet.jsp.jstl-1.1.2,并将它通过新建路径导入到工程的Referenced Libraries中。然后,重新部署项目(一定要重新部署一下,因为Tomcat Servers中还是原来未包含新增类库的信息,通过查看Tomcat安装路径的D:\Program Files\Apache Software Foundation\Tomcat 7.0\webapps\chapter2\WEB-INF\lib可以确认这一点,红色为工程名)。
javax.servlet.jsp.jstl类包我是从Spring给定的类库中导入的,如果你没有这个类库,也不要紧,从网上下载一个jstl-1.2.jar包,并在web工程中添加其路径即可,下载连接。
【补充】
NoClassDefFoundError 这类的报错,大多数情况下都是工程中缺失相关的类包,或者添加类包后未重新部署,亦或直接复制工程到新的路径而非通过Export;对于第一类问题(缺失相关的类包),我们要注意后面的报错详情,在本例中为javax/servlet/jsp/jstl/core/Config,它直观的告诉我们缺失的内容,根据这一关键信息,我们导入相关的缺失内容即可。