为什么我在HttpServletRequest上获得指向ServletFileUpload的NoClassDefFoundError?

时间:2011-01-28 20:32:22

标签: java tomcat servlets file-upload noclassdeffounderror

我最近开始使用JMeter在我的电脑上本地加载测试我的webapp。我有一个用于上传图像的jsp页面。图像由我的servlet处理。当我今天尝试这个过程时,我得到了以下异常/错误:

exception

javax.servlet.ServletException: Servlet execution threw an exception

root cause

java.lang.NoClassDefFoundError: javax/servlet/http/HttpServletRequest
    org.apache.commons.fileupload.servlet.ServletFileUpload.isMultipartContent(ServletFileUpload.java:68)
    spyder.servlets.imageProcessing.ImageProcessingServlet.uploadEditedImagesToDB(ImageProcessingServlet.java:527)
    spyder.servlets.imageProcessing.ImageProcessingServlet.doPost(ImageProcessingServlet.java:153)
    javax.servlet.http.HttpServlet.service(HttpServlet.java:637)
    javax.servlet.http.HttpServlet.service(HttpServlet.java:717)

以下是我的servlet中的异常引用的代码 -

boolean isPart = ServletFileUpload.isMultipartContent(req);

....是的,我已经在课堂上放了所有必要的import语句。

我不记得对我的系统上的任何会导致此问题的任何更改。这个过程总是运行没有任何问题,所以我不明白是什么导致它现在这样失败。我认为,在我使用JMeter之后失败了......

2 个答案:

答案 0 :(得分:9)

Commons FileUpload等所有第三方Web应用程序库都属于您的webapp的/WEB-INF/lib,而不属于其他地方。只要您将其置于JRE/libJRE/lib/ext

,就会发生此异常

事实上,正如Bozho所提到的,你还需要确保你没有移动/复制/复制任何特定于servlet容器的库(应该在Tomcat/lib中保持不变)在不同的地方。类路径。但那应该是IMO没有导致这种例外。它基本上告诉加载FileUpload API的类加载器完全不了解Servlet API。

如果您阅读了Tomcat classloading HOW-TO,那么您会看到JRE/libJRE/lib/ext中的库由不同的类加载器( bootstrap )加载Tomcat/lib常用)和/WEB-INF/lib webapp )中的内容。引导类加载器不了解常见和webapp库。反过来说。 common 类加载器具有 bootstrap 类加载器的知识,而 webapp 类加载器具有两者的知识。由于Servlet API通常由 common 类加载器加载,这只能意味着 bootstrap 类加载器加载了FileUpload API。这是错误的:)

答案 1 :(得分:2)

这意味着您的servlet容器没有servlet api。彻底安装Tomcat并尝试在那里部署。首先检查tomcat/lib中是否有servlet api jar。并确保您没有webapps/yourapp/WEB-INF/lib