Kotlin-प्लगइन और लाइब्रेरी: संस्करणों का झूठा अलार्म

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

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

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

परिचय: परिचित पीला त्रिकोण

\n

क्या आपने कभी IntelliJ IDEA में या Gradle बिल्ड के दौरान यह चेतावनी देखी है? यह दिखाई देती है, आप build.gradle.kts जांचते हैं — और देखते हैं कि संस्करण मेल खाते हैं। लेकिन IDE फिर भी पीले त्रिकोण से हाइलाइट करता रहता है: "Kotlin plugin version is not the same as library version"। परिचित लगता है?

\n

यह Stack Overflow पर सबसे लोकप्रिय समस्याओं में से एक है (हज़ारों बार देखा गया!)। ऐसा लगता है कि सिस्टम पागल हो गया है। लेकिन वास्तव में इसके पीछे एक बहुत ही विशिष्ट तकनीकी कारण है। इस लेख में, हम न केवल कष्टप्रद चेतावनी को हटाएंगे, बल्कि यह भी समझेंगे कि यह आपके Kotlin प्रोजेक्ट के अनुकूलन और प्रदर्शन को कैसे प्रभावित करता है।

\n\n

समस्या का सार: जब संस्करण मेल खाते हैं तो चेतावनी क्यों उत्पन्न होती है?

\n

आइए त्रुटि की संरचना को समझें। आप build.gradle.kts में लिखते हैं:

\n
plugins {\n    kotlin("jvm") version "1.9.22" apply false\n}\n\n// निर्भरता अनुभाग में:\nimplementation(kotlin("stdlib", "1.9.22"))\n
\n

सब कुछ ठीक लगता है। लेकिन Gradle दो अलग-अलग आर्टिफैक्ट देखता है:

\n
    \n
  • Kotlin Gradle Plugin — संस्करण 1.9.22 (संकलन का प्रबंधन करता है)
  • \n
  • Kotlin Stdlib — संस्करण 1.9.22 (रनटाइम लाइब्रेरी)
  • \n
\n

समस्या यह है कि Gradle Kotlin के किसी भिन्न संस्करण के साथ ट्रांज़िटिव निर्भरता खींच सकता है। उदाहरण के लिए, यदि आपका प्रोजेक्ट Fuel या Ktor लाइब्रेरी का उपयोग करता है, तो वे अपने साथ kotlin-stdlib:1.8.0 खींच सकते हैं। परिणामस्वरूप, क्लासपाथ में एक ही लाइब्रेरी के दो अलग-अलग संस्करण हो जाते हैं।

\n

IDE प्लगइन (1.9.22) और एक लाइब्रेरी (1.8.0) के बीच संस्करण विरोध देखता है — और चेतावनी देता है। इस दौरान, आपकी स्पष्ट निर्भरता kotlin("stdlib", "1.9.22") ट्रांज़िटिव निर्भरता द्वारा ओवरराइड हो सकती है।

\n\n

निदान: दोषी को कैसे खोजें?

\n

इलाज करने से पहले, यह समझना ज़रूरी है कि पुराना संस्करण कहाँ से आ रहा है। Gradle के अंतर्निहित टूल का उपयोग करें।

\n\n

विधि 1: Gradle कार्य dependencies

\n

टर्मिनल में चलाएँ:

\n
./gradlew dependencies --configuration runtimeClasspath
\n

आउटपुट में kotlin-stdlib वाली पंक्तियाँ खोजें। आप कुछ इस तरह देखेंगे:

\n
+--- org.jetbrains.kotlin:kotlin-stdlib:1.9.22\n|    \\--- org.jetbrains.kotlin:kotlin-stdlib-common:1.9.22\n+--- com.example:some-library:2.0.0\n|    \\--- org.jetbrains.kotlin:kotlin-stdlib:1.8.0 -> 1.9.22\n
\n

तीर -> दिखाता है कि Gradle ने संस्करण 1.9.22 के पक्ष में विरोध हल किया। लेकिन चेतावनी फिर भी बनी रह सकती है, यदि प्लगइन मूल संस्करणों का विश्लेषण करता है।

\n\n

विधि 2: IntelliJ IDEA — Module Settings

\n

File → Project Structure → Modules खोलें। अपना मॉड्यूल चुनें और Dependencies टैब देखें। वहाँ सभी निर्भरताएँ प्रदर्शित होती हैं, जिनमें ट्रांज़िटिव भी शामिल हैं। यदि आप kotlin-stdlib:1.8.0 (या कोई अन्य संस्करण) देखते हैं — तो यह समस्या का स्रोत है।

\n\n

चेतावनी ठीक करने के 4 तरीके (और प्रदर्शन बढ़ाएँ)

\n

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

\n\n

विधि 1: बलपूर्वक संस्करण संरेखण (Alignment)

\n

सबसे सही दृष्टिकोण Kotlin BOM (Bill of Materials) का उपयोग करना है। यह सुनिश्चित करता है कि सभी Kotlin निर्भरताएँ एक ही संस्करण की हों।

\n
// build.gradle.kts\ndependencies {\n    implementation(platform("org.jetbrains.kotlin:kotlin-bom:1.9.22"))\n    implementation("org.jetbrains.kotlin:kotlin-stdlib")\n    // अब संस्करण निर्दिष्ट करने की आवश्यकता नहीं — यह BOM से लिया जाता है\n}\n
\n

यह प्रदर्शन के लिए क्यों अच्छा है? BOM क्लासपाथ में क्लासों के दोहराव को समाप्त करता है। यदि आपके पास kotlin-stdlib

ब्लॉग

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