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

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

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中的exception所引用的代码 –

 boolean isPart = ServletFileUpload.isMultipartContent(req); 

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

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

所有第三方webapp库(如Commons FileUpload)都属于您的webapp的/WEB-INF/lib ,而不是其他地方。 只要将它放在JRE/libJRE/lib/ext就会发生此exception。

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

如果您读取Tomcat类加载HOW-TO ,那么您将看到JRE/libJRE/lib/ext中的JRE/lib/ext由不同于Tomcat/libcommon )和/WEB-INF/lib类加载器( 引导程序 )加载/WEB-INF/libwebapp )。 引导类加载器不了解常见和webapp库。 反过来说。 公共类加载器具有关于引导类加载器的知识,并且webapp类加载器具有关于两者的知识。 由于Servlet API通常由公共类加载器加载,这只能意味着FileUpload API是由引导类加载器加载的。 这是错的:)

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