2011-01-28 20 views
5

Gần đây tôi đã bắt đầu sử dụng JMeter để tải thử nghiệm webapp của tôi, cục bộ trên máy của tôi. Tôi có một trang jsp để tải lên hình ảnh. Các hình ảnh được xử lý bởi servlet của tôi. Khi tôi cố gắng quá trình này ngày hôm nay, tôi có ngoại lệ/lỗi sau:Tại sao tôi nhận được NoClassDefFoundError trên HttpServletRequest trỏ đến ServletFileUpload?

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) 

Đây là mã từ servlet của tôi rằng ngoại lệ được đề cập đến -

boolean isPart = ServletFileUpload.isMultipartContent(req); 

.... và có, Tôi đã đặt tất cả các câu lệnh import cần thiết trong lớp học.

Tôi không thể nhớ việc thực hiện bất kỳ thay đổi nào đối với bất kỳ điều gì trên hệ thống của mình có thể gây ra sự cố này. Quá trình này luôn chạy mà không gặp bất kỳ vấn đề nào, vì vậy tôi không hiểu điều gì khiến nó thất bại như thế này. Nó khá ngẫu nhiên, tôi nghĩ, rằng nó thất bại sau khi tôi đã sử dụng JMeter ...

Trả lời

9

Tất cả thư viện webapp của bên thứ ba như Commons FileUpload thuộc về /WEB-INF/lib của webapp của bạn, không phải ở nơi khác. Ngoại lệ này có thể xảy ra bất cứ khi nào bạn đặt nó trong JRE/lib hoặc JRE/lib/ext. Và thực sự, như Bozho đề cập đến, bạn cần đảm bảo rằng bạn chưa di chuyển/sao chép/nhân đôi bất kỳ thư viện đặc biệt nào của servletcontainer (mà không bị ảnh hưởng trong Tomcat/lib) xung quanh ở những nơi khác nhau của classpath. Nhưng điều đó nên IMO không có kết quả trong loại ngoại lệ. Về cơ bản nó nói rằng trình nạp lớp nạp API FileUpload hoàn toàn không có kiến ​​thức về API Servlet.

Nếu bạn đọc Tomcat classloading HOW-TO, sau đó bạn sẽ thấy rằng các thư viện trong JRE/libJRE/lib/ext được nạp bởi một classloader khác nhau (bootstrap) so với những người thân trong Tomcat/lib (chung) và /WEB-INF/lib (webapp) . Trình nạp lớp bootstrap không có kiến ​​thức về các thư viện phổ biến và webapp. Đó là một cách khác. Trình tải lớp phổ biến phổ biến có kiến ​​thức về trình tải lớp học bootstrap và trình tải lớp học webapp có kiến ​​thức về cả hai. Vì API Servlet thường được tải bởi bộ nạp lớp phổ biến, điều này chỉ có thể có nghĩa là API FileUpload đã được tải bởi trình tải lớp học bootstrap. Và điều này là sai :)

+0

Cảm ơn bạn đã chỉ ra lỗi của tôi. Tôi đã loại bỏ các jars bên thứ 3 ra khỏi thư mục jre/lib/ext (tôi đã sao chép chúng trong đó), và sau khi khởi động lại (không cài đặt lại) của Tomcat, quá trình này sẽ được sao lưu và chạy như trước. – katura

+0

Bạn được chào đón. – BalusC

+0

cảm ơn giải quyết vấn đề thủy tinh của tôi quá! – beatrice

2

Điều này có nghĩa là thùng chứa servlet của bạn không có api servlet. Hãy cài đặt Tomcat sạch và cố gắng triển khai ở đó. Trước tiên hãy kiểm tra xem bạn có api jar servlet trong tomcat/lib hay không. Và đảm bảo bạn không có nó trong webapps/yourapp/WEB-INF/lib

+0

Có, servlet-api.jar chỉ có trong c: \ jakarta-tomcat \ lib. Tôi đang chạy Tomcat 6.0.29. – katura

+0

@katura - chỉ cần thử trên một cài đặt mới. Cài đặt = giải nén. – Bozho

Các vấn đề liên quan