Java में JAXBException 2025: NoClassDefFoundError कैसे ठीक करें

शुरुआती लोगों के लिए ऑनलाइन Python प्रशिक्षक

Python आसानी से सीखें बिना सिद्धांत के बोझ के। स्वचालित जांच के साथ व्यावहारिक कार्य हल करें और ब्राउज़र में सीधे कोड लिखें।

पाठ्यक्रम शुरू करें

Java क्यों चिल्लाता है «NoClassDefFoundError: javax/xml/bind/JAXBException» और 2025 में इसका क्या करें?

\n\n

क्या आपने कभी ऐसी स्थिति देखी है जब आपका Java एप्लिकेशन, जो कल तक ठीक चल रहा था, आज अचानक java.lang.NoClassDefFoundError: javax/xml/bind/JAXBException जैसी डरावनी त्रुटि देकर क्रैश हो जाता है? अगर हाँ, तो आप अकेले नहीं हैं। इस सवाल ने Stack Overflow पर हज़ारों व्यूज़ बटोरे हैं, और 2025 में भी इसके समाधान की मांग कम नहीं हुई है। दरअसल, यह समस्या Java इकोसिस्टम में कुछ साल पहले हुए बुनियादी बदलावों से जुड़ी है, जो आज भी डेवलपर्स को परेशान करते हैं।

\n\n

इस लेख में हम सिर्फ़ एक 'रेडीमेड कोड' नहीं देंगे — हम विस्तार से समझाएँगे कि यह त्रुटि क्यों होती है, और इसे ठीक करने के तीन भरोसेमंद तरीके बताएँगे। आप सीखेंगे कि Maven, Gradle या JVM-आर्गुमेंट्स को सही तरीके से कैसे कॉन्फ़िगर करें ताकि आपका एप्लिकेशन फिर से काम करने लगे। चलिए शुरू करते हैं!

\n\n

समस्या की जड़: Java 9 और मॉड्यूलर सिस्टम

\n\n

यह सब Java 9 (2017 में रिलीज़) से शुरू हुआ। इस वर्शन में Oracle ने मॉड्यूलर सिस्टम (Project Jigsaw) लागू किया। कई पैकेज जो पहले स्टैंडर्ड लाइब्रेरी (JDK) का हिस्सा थे, उन्हें अलग मॉड्यूल में बाहर कर दिया गया या पूरी तरह हटा दिया गया। ऐसा ही एक पैकेज था javax.xml.bind (JAXB — Java Architecture for XML Binding)।

\n\n

Java 8 और उससे पुराने वर्शन में JAXB 'बॉक्स से बाहर' उपलब्ध था। Java 9 से यह वैकल्पिक हो गया। और Java 11 में इसे JDK से पूरी तरह हटा दिया गया। अगर आप ऐसा कोड लिखते हैं जो javax.xml.bind.JAXBContext, JAXBException या Marshaller का उपयोग करता है, और इसे Java 11+ पर चलाते हैं, तो आपको निश्चित रूप से NoClassDefFoundError मिलेगा।

\n\n

ध्यान दें: NoClassDefFoundError, ClassNotFoundException से अलग है। पहली त्रुटि तब होती है जब क्लास कंपाइलेशन के समय उपलब्ध था, लेकिन रनटाइम के दौरान गायब हो गया। दूसरी तब होती है जब क्लास बिल्कुल नहीं मिलता।

\n\n

परिदृश्य: व्यवहार में समस्या कैसी दिखती है

\n\n

मान लीजिए कि आपके पास XML के साथ काम करने के लिए एक सरल क्लास है:

\n\n
import javax.xml.bind.JAXBContext;\nimport javax.xml.bind.JAXBException;\nimport javax.xml.bind.Marshaller;\n\npublic class XmlProcessor {\n\n    public void convertToXml(Object obj) throws JAXBException {\n        JAXBContext context = JAXBContext.newInstance(obj.getClass());\n        Marshaller marshaller = context.createMarshaller();\n        marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, Boolean.TRUE);\n        // ... आउटपुट का लॉजिक\n    }\n}
\n\n

आप इस कोड को Java 8 पर कंपाइल करते हैं — सब ठीक है। फिर आप JDK को वर्शन 11 या 17 में अपडेट करते हैं, एप्लिकेशन चलाते हैं और यह देखते हैं:

\n\n
Exception in thread "main" java.lang.NoClassDefFoundError: javax/xml/bind/JAXBException\n    at XmlProcessor.convertToXml(XmlProcessor.java:6)\n    ...
\n\n

परिचित लग रहा है? अब इसे हल करते हैं।

\n\n

तरीका 1: JAXB API को बाहरी डिपेंडेंसी के रूप में जोड़ें (अनुशंसित)

\n\n

सबसे सही और आधुनिक तरीका यह है कि आप स्पष्ट रूप से बताएँ कि आपका एप्लिकेशन JAXB का उपयोग करता है। इसके लिए बिल्ड सिस्टम (Maven या Gradle) के माध्यम से लाइब्रेरी को कनेक्ट करना होगा।

\n\n

Maven के लिए (pom.xml)

\n\n

<dependencies> में यह जोड़ें:

\n\n
<dependency>\n    <groupId>jakarta.xml.bind</groupId>\n    <artifactId>jakarta.xml.bind-api</artifactId>\n    <version>4.0.2</version>\n</dependency>\n<dependency>\n    <groupId>org.glassfish.jaxb</groupId>\n    <artifactId>jaxb-runtime</artifactId>\n    <version>4.0.5</version>\n    <scope>runtime</scope>\n</dependency>
\n\n

ध्यान दें: Jakarta EE 9 (जून 2021) से पैकेज javax.xml.bind का नाम बदलकर jakarta.xml.bind कर दिया गया है। अगर आपका कोड पुराना है और javax.* का उपयोग करता है, तो भी आप इसे इस्तेमाल कर सकते हैं।

ब्लॉग

पुस्तक अनुशंसाएँ