为什么我在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/lib
或JRE/lib/ext
就会发生此exception。
事实上,正如Bozho所提到的,你还需要确保在类路径的不同位置周围没有移动/复制/复制任何特定于servlet容器的库(应该在Tomcat/lib
保持不变)。 但这应该是IMO没有导致这种例外。 它基本上告诉加载FileUpload API的类加载器完全不了解Servlet API。
如果您读取Tomcat类加载HOW-TO ,那么您将看到JRE/lib
和JRE/lib/ext
中的JRE/lib/ext
由不同于Tomcat/lib
( common )和/WEB-INF/lib
类加载器( 引导程序 )加载/WEB-INF/lib
( webapp )。 引导类加载器不了解常见和webapp库。 反过来说。 公共类加载器具有关于引导类加载器的知识,并且webapp类加载器具有关于两者的知识。 由于Servlet API通常由公共类加载器加载,这只能意味着FileUpload API是由引导类加载器加载的。 这是错的:)
这意味着您的servlet容器没有servlet api。 彻底安装Tomcat并尝试在那里部署。 首先检查tomcat/lib
中是否有servlet api jar。 并确保您没有在webapps/yourapp/WEB-INF/lib
- 使用java中的Restlet multipart / form-data上传文件
- MultipartResolver不起作用
- 文件上传“multipart / form”exceptionorg.apache.commons.fileupload.FileUploadBase $ InvalidContentTypeException
- 在GAE上使用apache fileupload
- 新上传的文件和Tomcat?
- Spring mvc:HTTP Status 400 – 必需的MultipartFile参数’file’不存在
- HTTP PUT以Java格式上传文件
- 在REST方法调用上上载的文件已损坏
- 弹簧启动时MultipartFile的最大限制