2011-01-28 49 views
5

我最近開始使用JMeter在本地PC上加載測試我的webapp。我有一個用於上傳圖片的jsp頁面。圖像由我的servlet處理。當我今天嘗試的過程中,我得到了以下異常/錯誤:爲什麼我在HttpServletRequest上得到一個指向ServletFileUpload的NoClassDefFoundError?

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後失敗了......

回答

9

所有第三方webapp庫如Commons FileUpload都屬於你的web應用程序的/WEB-INF/lib,而不是其他地方。每當您將它放入JRE/libJRE/lib/ext時,都會發生此異常。實際上,正如Bozho提到的那樣,您還需要確保您沒有在類路徑的不同位置移動/複製/複製任何特定於servletcontainer的庫(在Tomcat/lib中應該保持不變)。但是,國際海事組織不應該導致這種例外。它基本上告訴加載FileUpload API的類加載器完全不瞭解Servlet API。

如果你讀了Tomcat classloading HOW-TO,那麼你會看到,在JRE/libJRE/lib/ext庫是由不同的類加載器(引導)比那些在Tomcat/lib共同)和/WEB-INF/lib加載(web應用) 。引導類加載器對通用和webapp庫沒有任何瞭解。這是相反的。 通用類加載器具有關於引導程序的知識,類加載程序和web應用程序類加載程序具有關於這兩者的知識。由於Servlet API通常是由類加載器加載的,所以這隻能意味着FileUpload API由類加載器加載了引導程序。這是錯誤的:)

2

這意味着您的servlet容器沒有servlet api。採取乾淨安裝的Tomcat,並嘗試在那裏部署。首先檢查你是否有在tomcat/lib中的servlet api jar。並確保你沒有它webapps/yourapp/WEB-INF/lib

+0

是的,servlet-api.jar只在c:\ jakarta-tomcat \ lib中。我正在運行Tomcat 6.0.29。 – katura 2011-01-28 20:42:40

+0

@ katura - 只需嘗試一下全新的安裝。安裝=解壓。 – Bozho 2011-01-28 20:43:43

相關問題