Spring Boot डिपेंडेंसी हिंदी ट्यूटोरियल: प्रकार, मैनेजमेंट और वर्जन कन्फ्लिक्ट

ये हमारा Spring Boot Tutorials का चौथा आर्टिकल है और इसमें हम Dependency क्या होती है? और हम क्यों इसे यूज़ करते है? इसके साथ Dependencies के बारे में डिटेल में जानेंगे।

पिछले आर्टिकल में हमने Spring Initializr & Maven vs Gradle को अच्छेसे जाना था। आपको Spring Initializr के साथ प्रोजेक्ट शुरू करने में अब कोई दिक्कत नहीं होनी चाहिए। अब आगे बढ़ते है।

Spring Boot प्रोजेक्ट में डिपेंडेंसीज का एक अलग महत्व है, और Spring Boot सीखते वक्त, या प्रोजेक्ट बनाते वक्त ये शब्द काफी आम हो जाता है। जब तक हम डिपेंडेंसी को अच्छे से समझेंगे नहीं तब तक हम उसका सही तरह से यूज़ नहीं कर पाएंगे। क्योंकि जब किसी चीज को हम अच्छे से समझ लेते है तब हम सही तरह का डिसिशन ले सकते है की, कब और किस तरह से हमे उस चीज का यूज़ करना चाहिए? , करना चाहिए भी या नहीं? साथ ही जब हम उस चीज को अच्छे से समझ लेते है तब उस के साथ आने वाले प्रोब्लेम्स को भी आसानी से ढूंडकर हल कर पाते है।

Dependency क्या होती है


मैंने कई स्टूडेंट्स ऐसे भी देखे है की वे Spring Boot अच्छे से सीखे तो है लेकिन जब वे प्रोजेक्ट बनाते है तब डिपेंडेंसी की वजह से आने वाले वर्ज़न कन्फ्लिक्ट (Version Conflict) के प्रॉब्लम को समझ नही पाते। और काफी परेशान हो जाते है। इसलिए हम धीरे-धीरे सभी चीजों को सीखते हुए आगे बढ़ रहे है।

Dependency क्या होती है?

ये बने बनाये कोड का एक स्टोरेज है, जिसे हम आवश्यकता नुसार यूज़ करते है।

मान लो आप अपने घर पर कुछ प्लास्टिक के फूलों का डेकोरेशन करना है, तो आप ढेर सारा कलर-कलर का प्लास्टिक इकट्ठा करंगे फिर उसके फुल बनायेंगे और फिर डेकोरेशन करेंगे। वाकई ये काम बहुत ज्यादा थकाऊ होगा। या इसमें आपका काफी टाइम जायेगा। लेकिन आपके पास दूसरा आप्शन भी है जो आपका टाइम और मेहनत दोनों बचाता है, आप मार्किट जायेंगे और डायरेक्ट तरह-तरह के प्लास्टिक के फुल खरीद कर लायेंगे और डेकोरेशन का काम शुरू करेंगे।

यानी आपका समय और मेहनत दोनों को आप बचा सकते है। प्रोग्रामिंग में डिपेंडेंसीज प्रीबिल्ड कोड की लाइब्रेरीज है, जो आपके आवश्यकता नुसार आपको कोड प्रदान करती है, जिसे आप अपने प्रोजेक्ट में आसानी से यूज़ कर सकते है।

Dependency को हम टेक्निकल भाषा में External लाइब्रेरी, फ्रेमवर्क, या मॉड्यूल कहते है जो हम अपने प्रोग्राम या प्रोजेक्ट में आसानी से import करके उसका यूज़ कर सकते है। जिससे हमारी आवश्यकता भी पूरी होती है और हमे वो functionality दोबारा नहीं लिखनी पड़ती।

एक और प्रोग्रामिंग का Example लेते है, ताकि आप अच्छेसे समझ पायें। मान लो Engine एक डिपेंडेंसी है जिसमे Engine नाम का एक इंटरफ़ेस मौजूद है और उस Engine नामे के इंटरफेस के पास start नाम का फंक्शन है।

हमने एक Car class का प्रोग्राम लिखा है, जिसके लिए हमे Engine और उसके start फंक्शन की आवश्यकता है। हम खुद बनाने के बजाय अपने प्रोग्राम में Engine नाम की डिपेंडेंसी इंपोर्ट कर लेते है, और start फंक्शन का यूज़ करते है। यानी हमे खुद से Engine इंटरफेस बनाने की आवश्यकता नही पड़ी। अब हम निर्भर है डिपेंडेंसी पर। इससे हमारा समय और मेहनत दोनों बच गया।

प्रोग्रामिंग में यही काम होता है डिपेंडेंसीज का, जो हमारे बॉयलरप्लेट कोड को कम कर देता है।

- यह एक पहले से लिखा हुआ कोड (library/framework/module) होता है।
- इसे हम अपने प्रोजेक्ट में जोड़कर functionality को दोबारा लिखने से बचते हैं।
- इससे समय और मेहनत दोनों की बचत होती है।


डिपेंडेंसीज को सॉफ्टवेयर डेवलपमेंट का अहम् हिस्सा माना जाता है। सभी प्रोग्रामिंग लैंग्वेज की डिपेंडेंसीज और डिपेंडेंसी मैनेजमेंट सिस्टम होता है। ये हमारा Spring Boot का ट्यूटोरियल है इसलिए हम यहाँ Java Dependency की बात करते है।

आइए, आगे बढ़ते हैं और जानते है जावा की डिपेंडेंसी कहाँ स्टोर होती है, किस तरह से स्टोर और मैनेज की जाती है?, (जैसे की हमने पिछले आर्टिकल में Maven और Gradle के बारे में डिटेल में पढ़ा है, ये दोनों ही बिल्ड टूल्स हैं जो जावा प्रोजेक्ट्स में डिपेंडेंसीज़ को इंस्टॉल, अपडेट, और मैनेज करते हैं) ये सब डिटेल में जानते है।

Dependency Management और Storage

जब मैं Spring Framework सिख रहा था, तो डिपेंडेंसी के बारे में मेरे मन में कई सवाल थे, Maven और Gradle जैसे टूल्स सिर्फ डिपेंडेंसी को इनस्टॉल, अपडेट और मैनेज करते है, लेकिन ये डिपेंडेंसी बनता कौन होगा, ये कहाँ स्टोर रहती होगी? इस तरह से कई सवाल।


डिपेंडेंसी कैसे बनती है? ( Dependency Creaters)

डिपेंडेंसी बनाते है कई ऐसे टेक कंपनिया जिन्हें इसकी आवश्यकता होती है, जैसे Google, Netflix, Amazon जैसी कंपनिया, ओपन सोर्स प्रोजेक्ट परकाम करने वाले बड़े-बड़े डेवलपर्स (Open-Source Contributors), या इंडिविजुअल डेवलपर्स (Individual Developers) डिपेंडेंसीज का निर्माण करते है, और सभी के यूज़ के लिए ये डिपेंडेंसी बनाकर बड़े स्टोरेज में इसे रखते है, जो आज के टाइम डिपेंडेंसीज की विशाल लाइब्रेरी है, उसका नाम है Maven Central Repository जिसे Maven Central भी कहा जाता है।

Maven Central Repository क्या है?

हम ये कहे की, Maven Central Repository ये जावा पर आधारित प्रोजेक्ट्स के लिए दुनिया की सबसे बड़ी पब्लिक आर्टिफैक्ट रिपॉजिटरी(Public Artifact Repository) है तो ये गलत नहीं होगा, क्योंकि यहाँ पर लाखों जावा लाइब्रेरीज POM, JAR, WAR जैसे फार्मेट में रखी गयी है। और जावा के सभी फ्रेमवर्क के लिए,  जैसे-
  • Spring Framework
  • Hibernate(ORM)
  • Apache Commons
  • Log4j
  • JUnit
इन सब की डिपेंडेंसीज को Maven Central से ही मैनेज किया जाता है।

Maven Central डेवलपर्स को एक Centralized System देता है, जहाँ से डेवलपर्स ज़रूरी dependencies को अपने प्रोजेक्ट में आसानी से शामिल कर सकते हैं।

आपकी जानकारी के लिए बता दूँ की Maven Central Repository को होस्ट करती है sonatype कम्पनी और इसे Apache Maven द्वारा मैनेज किया जाता है।

अब हम जानते है की Spring Boot में कौन-कौन से टाइप्स की डिपेंडेंसीज यूज़ होती है।

Types Of Dependencies Using Spring Boot

हमारा ये Spring Boot Tutorials है तो हम यहांपर डिपेंडेंसीज के वो टाइप्स जानते है जो हम स्प्रिंग फ्रेमवर्क या Spring boot में यूज़ करते है।
  1. Modular Dependencies - Spring के अलग-अलग modules की dependencies
  2. Transitive Dependencies - एक dependency tree
  3. Starter Dependencies (only Spring Boot) - डिपेंडेंसी बण्डल
इस तरह से Dependencies को अलग अलग टाइप्स में बाँटा गया है, जिसे हम डिटेल में आगे समझेंगे जब हम रियल प्रोजेक्ट पर काम करना शुरू करेंगे। क्योंकि अभी हम डिपेंडेंसी टाइप्स को विस्तार से जानते हा इतो वो शायद आपको थोडा मुश्किल लग सकता है।

डिपेंडेंसी डेवलपर्स के लिए किसी वरदान से कम नहीं, लेकिन Dependency में भी कई बार Version Conflict की समस्या आती है, इसे भी हमें थोडा ऊपर-उपर समझ लेना है, क्योंकि ज्यादा डीप में हम समझने जायंगे तो ये नये-नये स्प्रिंग बूट सिखने वालों के लिए complicated लग सकता है जिसे हम कंफ्यूज हो सकते है।

हम ट्यूटोरियल को इस तरह से आगे बढ़ा रहे है ताकि हम शुरवात से स्प्रिंग बूट के कांसेप्ट को अच्छे से समझ सकें बिना कंफ्यूजन के। इसलिए Version Conflict की समस्या और उसे सुलझाने के के तरीकों के बारे में हम काफी विस्तार से आगे समझने वाले है।

अभी के लिए हम इसे थोडा संक्षेप में समझ लेते है ताकि आगे हमें ये टॉपिक एकदम नया न लगे।

Version Conflicts की समस्या कब निर्माण होती है?

Version Conflicts के निर्माण के लिए कई प्रमुख कारण हो सकते है, जैसे -
  • जब किसी प्रोजेक्ट में एक ही लाइब्रेरी के दो अलग-अलग वर्शन के डिपेंडेंसी का यूज़ होना
  • Pom.xml में स्पष्ट तौर पर डिपेंडेंसी वर्शन का declaration ना होना
  • जटिल प्रोजेक्ट में Dependency tree का ज्यादा डीप होना
  • एक ही लाइब्रेरी के दो वर्शन में अगर signature मेथड में बदलाव होना
  • प्रोजेक्ट में अलग-अलग मोडयुल्स का एक ही डिपेंडेंसी के अलग-अलग वर्शन पर डीपेंड होना
Version Conflict की वजह से मिलनेवाली Runtime Exception
  • NoSuchMethodError
  • ClassNotFoundException
  • NoClassDefFoundError
  • InCompatibleClassChangeError
इस तरह के एक्सेप्शन हमें Version Conflicts के साथ मिलते है। मैं आपको ये काफी डिटेल में आगे बताऊंगा ताकि आप इसे अच्छे से हैंडल कर पाए।

दोस्तों, ये टॉपिक मैं अभी डिटेल में नहीं समझना चाहता, जब तक आप Spring Boot के साथ सहज नहीं हो जाते। क्योंकि इसमें कई ऐसे टॉपिक होते है, जो शुरवात में समझ के बाहर हो सकते है। इसलिए हम धीरे धीरे आगे बढ़ेंगे ताकि Spring Boot को सही तरह से सिख पायें।

Next Article में क्या होगा?

Next आर्टिकल हमारा स्प्रिंग कंपोनेंट्स को कवर करेगा क्योंकि हम जब प्रोजेक्ट शुरू करेंगे तो सबसे पहले हमे कंपोनेंट्स के साथ ही काम करना है। मोड्यूल, रिपॉजिटरी, कंट्रोलर, सर्विस, जैसे कई कंपोनेंट्स को हम अगले आर्टिकल में कवर करेंगे।

टिप्पणियाँ

इस ब्लॉग से लोकप्रिय पोस्ट

Spring Boot हिंदी ट्यूटोरियल: Spring Boot क्या है और इसके फायदे

Spring Initializr हिंदी ट्यूटोरियल: Maven vs Gradle और प्रोजेक्ट सेटअप गाइड

Spring Boot Development Environment Setup हिंदी में: JDK, Maven, Gradle सेटअप गाइड