我最近开始使用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之后失败了......
答案 0 :(得分:9)
Commons FileUpload等所有第三方Web应用程序库都属于您的webapp的/WEB-INF/lib
,而不属于其他地方。只要您将其置于JRE/lib
或JRE/lib/ext
。
事实上,正如Bozho所提到的,你还需要确保你没有移动/复制/复制任何特定于servlet容器的库(应该在Tomcat/lib
中保持不变)在不同的地方。类路径。但那应该是IMO没有导致这种例外。它基本上告诉加载FileUpload API的类加载器完全不了解Servlet API。
如果您阅读了Tomcat classloading HOW-TO,那么您会看到JRE/lib
和JRE/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