一尘不染

为什么在HttpServletRequest上收到一个指向ServletFileUpload的NoClassDefFoundError?

tomcat

我最近开始使用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后失败了。


阅读 251

收藏
2020-06-16

共1个答案

一尘不染

所有第三方网络应用程序库(例如Commons FileUpload)都属于/WEB- INF/lib您的网络应用程序,而不属于其他应用程序。只要将其放在JRE/lib或中,就会发生此异常JRE/lib/ext

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

如果您阅读了Tomcat类加载HOW-TO,那么您将看到JRE/lib与( common )和( webapp )中的库JRE/lib/ext不同的类加载器(
bootstrap )和中的库是由不同的类加载器( bootstrap )加载的。引导程序类加载器不了解公共库和Webapp库。相反。在 常见的
类加载器有知识有关的 引导 类加载器和 web应用程序 的类加载器有大约两个知识。由于Servlet API通常是由 公共
类加载器加载的,因此这仅意味着FileUpload API是由 引导程序 加载的Tomcat/lib /WEB-INF/lib
__类加载器。 这是错误的:)

2020-06-16