5

我最近开始使用 JMeter 在我的电脑上本地加载测试我的 web 应用程序。我有一个用于上传图片的 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 之后它失败了......

4

2 回答 2

11

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

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

如果您阅读了Tomcat 类加载 HOW-TO,那么您会看到其中的库由不同JRE/libJRE/lib/ext类加载器 ( bootstrap ) 加载,而不是Tomcat/lib( common ) 和/WEB-INF/lib( webapp ) 中的类加载器 ( bootstrap )。引导类加载器不了解通用库和 webapp 库。反之亦然。通用类加载器了解引导类加载器,而webapp类加载器了解两者。由于 Servlet API 通常由公共类加载器加载,这只能意味着 FileUpload API 是由引导程序加载的类加载器。这是错误的:)

于 2011-01-28T20:37:18.870 回答
2

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

于 2011-01-28T20:36:27.173 回答