2011-01-28 17 views
5

मैंने हाल ही में अपने पीसी पर स्थानीय रूप से परीक्षण करने के लिए जेएमटर का उपयोग करना शुरू किया। मेरे पास छवियों को अपलोड करने के लिए एक jsp पेज है। छवियों को मेरे सर्वलेट द्वारा संसाधित किया जाता है। मैं आज इस प्रक्रिया की कोशिश की, मैं निम्नलिखित अपवाद/त्रुटि मिली:मुझे HttpServletRequest पर NoClassDefFoundError क्यों मिल रहा है जो 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) 

यहाँ मेरी सर्वलेट से कोड है कि अपवाद की चर्चा करते हुए किया जाता है -

boolean isPart = ServletFileUpload.isMultipartContent(req); 

.... और हाँ, मैंने कक्षा में सभी आवश्यक import कथन रखे हैं।

मैं अपने सिस्टम पर किसी भी चीज में कोई बदलाव करने को याद नहीं कर सकता जो इस समस्या का कारण बनता है। यह प्रक्रिया हमेशा बिना किसी समस्या के चलती है, इसलिए मुझे समझ में नहीं आ रहा है कि अब इस तरह असफल होने का कारण क्या है। मुझे लगता है कि यह संयोगजनक है, कि मैं जेएमटर का उपयोग कर रहा हूं ...

उत्तर

9

सभी तृतीय पक्ष वेबपैम लाइब्रेरी जैसे कॉमन्स फ़ाइलउप्लोड आपके वेबैप के /WEB-INF/lib में हैं, अन्यत्र नहीं। यह अपवाद तब भी हो सकता है जब आपने इसे JRE/lib या JRE/lib/ext में रखा हो।

और वास्तव में, जैसा कि बोझो उल्लेख करता है, आपको यह भी सुनिश्चित करना होगा कि आपने क्लासपाथ के विभिन्न स्थानों में किसी भी सर्वलेटकेंटर-विशिष्ट पुस्तकालयों (जिसे Tomcat/lib में छूटा नहीं जाना चाहिए) को स्थानांतरित/प्रतिलिपि/डुप्लिकेट नहीं किया है। लेकिन आईएमओ को इस तरह के अपवाद के परिणामस्वरूप नहीं होना चाहिए। यह मूल रूप से बता रहा है कि FileUpload API को लोड करने वाले क्लासलोडर को सर्वलेट एपीआई के बारे में पूरी तरह से कोई जानकारी नहीं है।

आप Tomcat classloading HOW-TO पढ़ा है, तो आप देखेंगे कि JRE/lib और JRE/lib/ext में पुस्तकालयों Tomcat/lib (आम) और /WEB-INF/lib में एक अलग classloader ( बूटस्ट्रैप) की तुलना में से लोड किए गए हैं (webapp) । बूटस्ट्रैप क्लासलोडर को सामान्य और वेबैप पुस्तकालयों के बारे में कोई जानकारी नहीं है। यह दूसरा रास्ता है। आम क्लासलोडर के पास बूटस्ट्रैप क्लासलोडर के बारे में ज्ञान है और वेबैप क्लासलोडर दोनों के बारे में ज्ञान है। चूंकि सर्वलेट एपीआई आमतौर पर सामान्य क्लासलोडर द्वारा लोड की जाती है, इसका मतलब यह हो सकता है कि FileUpload API को बूटस्ट्रैप क्लासलोडर द्वारा लोड किया गया था। और यह गलत है :)

+0

मेरी त्रुटि को इंगित करने के लिए धन्यवाद। मैंने जेआर/lib/ext फ़ोल्डर (मैंने उन्हें वहां कॉपी किया था) से तीसरे पक्ष के जार हटा दिए, और टॉमकैट के पुनरारंभ (पुनर्स्थापित नहीं) के बाद, प्रक्रिया बैक अप और चल रही थी। – katura

+0

आपका स्वागत है। – BalusC

+0

धन्यवाद मेरे ग्लासफ़िश समस्याओं को भी हल किया! – beatrice

2

इसका मतलब है कि आपके सर्वलेट कंटेनर में सर्वलेट एपीआई नहीं है। टोमकैट की एक साफ स्थापना करें और वहां तैनात करने का प्रयास करें। सबसे पहले जांचें कि आपके पास tomcat/lib में सर्वलेट एपी जार है। और सुनिश्चित करें कि आपके पास webapps/yourapp/WEB-INF/lib

+0

हां, servlet-api.jar केवल c: \ jakarta-tomcat \ lib में है। मैं टॉमकैट 6.0.2 9 चला रहा हूँ। – katura

+0

@ कतुरा - बस इसे एक नई स्थापना पर आज़माएं। इंस्टॉल करें = अनजिप करें। – Bozho

संबंधित मुद्दे