परिचय: उस त्रुटि से परिचित होना जो शुरुआती लोगों को डराती है
\n\nआपने Java में एक प्रोग्राम लिखा, उसे कंपाइल किया, JAR फ़ाइल में पैक किया और गर्व से डबल क्लिक करके चलाने का प्रयास किया — लेकिन एप्लिकेशन विंडो के बजाय आपको एक काली टर्मिनल विंडो दिखती है जिसमें डरावना संदेश होता है: Can't execute jar- file: "no main manifest attribute"। परिचित लगता है? यदि नहीं — तो समझिए कि आप भाग्यशाली हैं (अभी के लिए)।
यह त्रुटि Stack Overflow पर सबसे लोकप्रिय में से एक है। ज़रा सोचिए: हजारों डेवलपर्स, छात्रों से लेकर अनुभवी इंजीनियरों तक, कम से कम एक बार अपने JAR फ़ाइल के चलने से «इनकार» करने का सामना कर चुके हैं। ऐसा क्यों होता है? बात यह है कि Java सिर्फ «पैक करो और चलाओ» नहीं है। वर्चुअल मशीन को स्पष्ट रूप से पता होना चाहिए: किस क्लास में प्रवेश बिंदु है? इस जानकारी के बिना, JAR फ़ाइल एक सामान्य आर्काइव बनी रहती है, न कि एक एक्ज़ीक्यूटेबल प्रोग्राम।
\n\nइस लेख में हम समझेंगे कि मैनिफेस्ट क्या है, इसका प्रवेश बिंदु से क्या संबंध है, और — सबसे महत्वपूर्ण — कैसे सुनिश्चित करें कि आपकी JAR फ़ाइल बिना किसी त्रुटि के चले। हम सरल से जटिल की ओर बढ़ेंगे: कमांड लाइन पर मैन्युअल बिल्डिंग से लेकर IDE कॉन्फ़िगरेशन तक। चलिए शुरू करते हैं!
\n\nमैनिफेस्ट क्या है और इसकी आवश्यकता क्यों है?
\n\nप्रत्येक JAR फ़ाइल (Java Archive) के अंदर एक META-INF फ़ोल्डर होता है, और उसमें एक MANIFEST.MF फ़ाइल होती है। यह सिर्फ एक तकनीकी आर्टिफैक्ट नहीं है, बल्कि Java वर्चुअल मशीन के लिए एक वास्तविक «उपयोग निर्देश» है।
एक ऐसी किताब की कल्पना करें जिसमें विषय सूची न हो। आप जानते हैं कि इसमें अध्याय हैं, लेकिन आप नहीं जानते कि पढ़ना किस पेज से शुरू करना है। लगभग यही बात मुख्य क्लास के बिना JAR फ़ाइल के साथ होती है। वर्चुअल मशीन कई क्लासेस देखती है, लेकिन यह नहीं जानती कि उनमें से किसमें public static void main(String[] args) मेथड है।
एक सामान्य MANIFEST.MF फ़ाइल इस तरह दिखती है:
Manifest-Version: 1.0\nCreated-By: 17.0.2 (Oracle Corporation)\nMain-Class: com.example.Main\n\n\nयहाँ सबसे महत्वपूर्ण पंक्ति Main-Class है। यह क्लास का पूरा नाम (पैकेज के साथ) बताती है जिसे Java को चलाना चाहिए। यदि यह पंक्ति नहीं है या गलत है — तो आपको वही «no main manifest attribute» त्रुटि मिलती है।
मैनिफेस्ट खाली या गलत क्यों हो सकता है?
\n\n- \n
jarके माध्यम से मैन्युअल बिल्डिंग — यदि आपने-eफ्लैग निर्दिष्ट नहीं किया या अपना स्वयं का मैनिफेस्ट नहीं बनाया। \n - बिना कॉन्फ़िगरेशन के IDE में बिल्डिंग — कुछ डेवलपमेंट एनवायरनमेंट (विशेषकर पुराने संस्करण) स्वचालित रूप से
Main-Classनहीं जोड़ते। \n - नामकरण में लापरवाही — उदाहरण के लिए, आपने
mainछोटे अक्षरों में लिखा या पैकेज निर्दिष्ट करना भूल गए। \n - एन्कोडिंग और फ़ॉर्मेटिंग — मैनिफेस्ट में फ़ाइल के अंत में प्रत्येक खाली पंक्ति महत्वपूर्ण है। \n
एक्ज़ीक्यूटेबल JAR फ़ाइल कैसे बनाएं: तीन तरीके
\n\nतरीका 1. कमांड लाइन (मैन्युअल नियंत्रण)
\n\nयह विधि प्रक्रिया की पूरी समझ देती है। मान लीजिए हमारे पास एक सरल क्लास HelloWorld.java है:
package com.example;\n\npublic class HelloWorld {\n public static void main(String[] args) {\n System.out.println("नमस्ते, दुनिया! JAR काम कर रहा है!");\n }\n}\n\n\nचरण 1. क्लास को कंपाइल करें
\njavac -d . HelloWorld.java\nफ्लैग -d . पैकेज संरचना बनाता है (com/example/HelloWorld.class)।
चरण 2. मैन्युअल रूप से मैनिफेस्ट बनाएं
\nनिम्नलिखित सामग्री के साथ एक फ़ाइल MANIFEST.MF बनाएं (उदाहरण के लिए, नोटपैड में):
Manifest-Version: 1.0\nMain-Class: com.example.HelloWorld\n\nमहत्वपूर्ण: अंतिम पंक्ति के बाद एक खाली पंक्ति होनी चाहिए! इसके बिना, JAR फ़ाइल मैनिफेस्ट को नहीं पढ़ सकती है।
\n\nचरण 3. JAR बनाएं
\njar cfm HelloWorld.jar MANIFEST.MF com/example/HelloWorld.class\nफ्लैग
ब्लॉग
पुस्तक अनुशंसाएँ
यह भी पढ़ें
जावास्क्रिप्ट में JSON के साथ काम करना: शुरुआती लोगों के लिए पार्सिंग और सीरियलाइज़ेशन
PHP में एल्गोरिदम और डेटा संरचनाएँ: व्यावहारिक गाइड
Swift कोड डीबगिंग: गुप्त तकनीकें और शक्तिशाली उपकरण
जावा में स्टैटिक क्लासेस: यह क्या है और हुड के नीचे कैसे काम करता है
2025 के लिए C# फ्रेमवर्क: बैकएंड, वेब और माइक्रोसर्विसेज के लिए सही चुनाव