"JAR को फ़ोल्डर में कॉपी करना" काम क्यों नहीं करता?
\n\nहर Java डेवलपर, जिसने कभी Maven का सामना किया है, देर-सबेर एक दीवार से टकराता है: "मुझे एक पुरानी लाइब्रेरी कनेक्ट करनी है जो Maven Central में नहीं है। क्या करूँ?"। आप गूगल करते हैं, Stack Overflow पर हज़ारों व्यूज़ वाला एक सवाल ढूँढ़ते हैं, पहली सलाह आज़माते हैं — और ClassNotFoundException या Missing artifact मिलता है।
परिचित लगता है? इस लेख में हम Maven प्रोजेक्ट में स्थानीय JAR फ़ाइलें जोड़ने में शीर्ष गलतियों पर चर्चा करेंगे और, सबसे महत्वपूर्ण, उनसे कैसे बचें। आप न केवल सिद्धांत जानेंगे, बल्कि कार्यशील कोड भी देखेंगे जिसे आप तुरंत अपने Java प्रोजेक्ट में लागू कर सकते हैं।
\n\nगलती #1: systemPath के बिना System scope
\n\nशुरुआती लोगों का सबसे लोकप्रिय जाल — <scope>system</scope> के साथ निर्भरता जोड़ना, लेकिन <systemPath> निर्दिष्ट करना भूल जाना। Maven ईमानदारी से JAR खोजने की कोशिश करता है, लेकिन नहीं जानता कि वह कहाँ है।
त्रुटि कैसी दिखती है
\n[ERROR] Failed to execute goal on project my-app: \nCould not resolve dependencies for project com.example:my-app:jar:1.0: \nThe following artifacts could not be resolved: \ncom.example:my-custom-lib:jar:1.0 (absent)\n\nगलत कोड
\n<dependency>\n <groupId>com.example</groupId>\n <artifactId>my-custom-lib</artifactId>\n <version>1.0</version>\n <scope>system</scope>\n <!-- systemPath गायब है! -->\n</dependency>\n\nसही समाधान
\n<systemPath> के माध्यम से हमेशा JAR फ़ाइल का पूरा पथ निर्दिष्ट करें। किसी विशिष्ट डेवलपर मशीन से बंधने से बचने के लिए प्रोजेक्ट रूट से सापेक्ष पथ का उपयोग करना उचित है।
<dependency>\n <groupId>com.example</groupId>\n <artifactId>my-custom-lib</artifactId>\n <version>1.0</version>\n <scope>system</scope>\n <systemPath>${project.basedir}/libs/my-custom-lib-1.0.jar</systemPath>\n</dependency>\n\nमहत्वपूर्ण: JAR फ़ाइल आपके प्रोजेक्ट के अंदर libs/ फ़ोल्डर में होनी चाहिए। यदि अभी तक नहीं बनाया है तो इसे बनाएँ।
गलती #2: मल्टी-मॉड्यूल प्रोजेक्ट्स के लिए install-file भूल गए
\n\nमान लीजिए आपने system scope के माध्यम से एक स्थानीय JAR जोड़ा, और यह स्थानीय रूप से काम करता है। लेकिन जब आप CI सर्वर (Jenkins, GitLab CI) पर प्रोजेक्ट बनाने का प्रयास करते हैं — बिल्ड विफल हो जाता है। क्यों? क्योंकि system scope ट्रांज़िटिव रूप से स्थानांतरित नहीं होता और Maven स्थानीय रिपॉजिटरी में नहीं जाता।
सही दृष्टिकोण: स्थानीय रिपॉजिटरी में JAR स्थापित करना
\nmvn install:install-file कमांड का उपयोग करें। यह आपके JAR को ~/.m2/repository में जोड़ देगा, और यह प्रोजेक्ट के सभी मॉड्यूल और CI बिल्ड के लिए उपलब्ध होगा।
mvn install:install-file \\\n -Dfile=libs/my-custom-lib-1.0.jar \\\n -DgroupId=com.example \\\n -DartifactId=my-custom-lib \\\n -Dversion=1.0 \\\n -Dpackaging=jar \\\n -DgeneratePom=true\n\nइसके बाद pom.xml में systemPath के बिना सामान्य निर्भरता निर्दिष्ट की जा सकती है:
<dependency>\n <groupId>com.example</groupId>\n <artifactId>my-custom-lib</artifactId>\n <version>1.0</version>\n</dependency>\n\nगलती #3: रिपॉजिटरी में file:// URL का उपयोग
\n\nकुछ डेवलपर <repository> के माध्यम से file:// URL के साथ एक स्थानीय फ़ोल्डर को रिपॉजिटरी के रूप में जोड़कर Maven को "धोखा" देने का प्रयास करते हैं। तकनीकी रूप से यह काम करता है, लेकिन बहुत सारी समस्याएँ पैदा करता है:
- \n
- अपोर्टेबिलिटी: पथ
/home/user/project/libsदूसरी मशीन पर काम नहीं करेगा। \n - संस्करणों में भ्रम: ... \n