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

kat*_*ura 5 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)
Run Code Online (Sandbox Code Playgroud)

这是我的servlet中的异常所引用的代码 -

boolean isPart = ServletFileUpload.isMultipartContent(req);
Run Code Online (Sandbox Code Playgroud)

....是的,我已经import在课堂上提出了所有必要的陈述.

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

Bal*_*usC 10

所有第三方webapp库(如Commons FileUpload)都属于/WEB-INF/lib您的webapp,而不是其他地方.无论何时将其放入JRE/lib或中,都会发生此异常JRE/lib/ext.

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

如果你读了Tomcat的类加载HOW-TO,那么你会看到,在图书馆JRE/libJRE/lib/ext由不同的类加载器(加载引导)比那些Tomcat/lib(普通)和/WEB-INF/lib(Web应用程序).引导类加载器不了解常见和webapp库.反过来说.在常见的类加载器有知识有关的引导类加载器和web应用程序的类加载器有大约两个知识.由于Servlet API通常由公共类加载器加载,这只能意味着FileUpload API是由引导类加载器加载的.这是错的:)