Maven में निर्भरताओं के साथ JAR बनाना: शुरुआती लोगों के लिए चरण-दर-चरण मार्गदर्शिका

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

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

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

«आपका एप्लिकेशन केवल IDE में काम करता है? अब इसे ठीक करने का समय आ गया है!»

\n\n

यदि आपने कभी Java में लिखा है, तो आपने निश्चित रूप से ऐसी स्थिति का सामना किया होगा: आप गर्व से अपने दोस्त को अपना नया प्रोजेक्ट दिखाते हैं, इसे IntelliJ IDEA या Eclipse में चलाते हैं — सब कुछ पूरी तरह से काम करता है। लेकिन जब आप यह प्रोजेक्ट किसी सहकर्मी को देते हैं या इसे कमांड लाइन के माध्यम से चलाने का प्रयास करते हैं — और आपका सामना ClassNotFoundException या NoClassDefFoundError से होता है। परिचित लगता है?

\n\n

अधिकांश शैक्षिक पाठ्यक्रमों और ट्यूटोरियल में, Maven का उपयोग करके JAR फ़ाइल बनाना दिखाया जाता है, लेकिन अक्सर एक महत्वपूर्ण विवरण छोड़ दिया जाता है: निर्भरताएँ कहाँ जाती हैं? एक सामान्य JAR फ़ाइल में केवल आपका कोड होता है, और सभी लाइब्रेरीज़ (जैसे Apache Commons, Jackson, JUnit) बाहर रह जाती हैं। यही कारण है कि Stack Overflow पर लाखों Java डेवलपर्स द्वारा पूछा गया प्रश्न उठता है: «How can I create an executable/runnable JAR with dependencies using Maven?»

\n\n

इस लेख में, हम Maven का उपयोग करके निर्भरताओं के साथ निष्पादन योग्य JAR बनाने के कई सिद्ध तरीकों पर चर्चा करेंगे। आप सीखेंगे कि maven-assembly-plugin, maven-shade-plugin को कैसे कॉन्फ़िगर करें और यह Spring Boot में कैसे काम करता है। चलिए शुरू करते हैं!

\n\n

सामान्य JAR काम क्यों नहीं करता?

\n\n

आइए एक सरल प्रयोग करते हैं। कल्पना करें कि आपके पास एक एप्लिकेशन है जो Jackson लाइब्रेरी का उपयोग करके JSON को पार्स करता है। आप कमांड mvn package के साथ एक सामान्य JAR बनाते हैं, और फिर इसे चलाने का प्रयास करते हैं:

\n\n
java -jar my-app.jar
\n\n

और आपको कुछ इस तरह मिलता है:

\n\n
Exception in thread "main" java.lang.NoClassDefFoundError: com/fasterxml/jackson/databind/ObjectMapper
\n\n

ऐसा क्यों होता है? क्योंकि Maven डिफ़ॉल्ट रूप से केवल आपके संकलित कोड को पैकेज करता है (फ़ोल्डर src/main/java से क्लासेस)। आपके द्वारा pom.xml में निर्दिष्ट सभी निर्भरताएँ Maven के स्थानीय रिपॉजिटरी (~/.m2/repository) में रहती हैं। जब आप JAR चलाते हैं, तो JVM को पता नहीं होता कि इन लाइब्रेरीज़ को कहाँ खोजना है, और यह त्रुटि देता है।

\n\n

समाधान — एक fat JAR (मोटा JAR) या uber JAR बनाना है, जिसके अंदर न केवल आपकी क्लासेस होंगी बल्कि सभी आवश्यक निर्भरताएँ भी होंगी। इसी उद्देश्य के लिए विशेष Maven प्लगइन्स मौजूद हैं।

\n\n

तरीका 1: maven-assembly-plugin (सरल और विश्वसनीय)

\n\n

सबसे लोकप्रिय और सरल तरीका maven-assembly-plugin का उपयोग करना है। यह एक JAR बनाता है जिसमें सभी निर्भरताएँ अनपैक की जाती हैं और आपकी क्लासेस के साथ मर्ज की जाती हैं। आइए इसे कॉन्फ़िगर करें।

\n\n

अपने pom.xml में <build><plugins> अनुभाग में निम्नलिखित कोड जोड़ें:

\n\n
<plugin>\n    <groupId>org.apache.maven.plugins</groupId>\n    <artifactId>maven-assembly-plugin</artifactId>\n    <version>3.6.0</version>\n    <configuration>\n        <descriptorRefs>\n            <descriptorRef>jar-with-dependencies</descriptorRef>\n        </descriptorRefs>\n        <archive>\n            <manifest>\n                <mainClass>com.example.Main</mainClass>\n            </manifest>\n        </archive>\n    </configuration>\n    <executions>\n        <execution>\n            <id>make-assembly</id>\n            <phase>package</phase>\n            <goals>\n                <goal>single</goal>\n            </goals>\n        </execution>\n    </executions>\n</plugin>
\n\n

महत्वपूर्ण: com.example.Main को अपनी main विधि वाली क्लास के पूर्ण नाम से बदलें।

\n\n

अब प्रोजेक्ट को कमांड से बनाएँ:

\n\n
mvn clean package
\n\n

फ़ोल्डर target में दो फ़ाइलें दिखाई देंगी:

\n
    \n
  • my-app.jar — सामान्य
  • \n

ब्लॉग

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