क्या आपने "Module was compiled with an incompatible version of Kotlin" देखा है? आप अकेले नहीं हैं!
\n\nकल्पना करें: आप Kotlin में कोड लिख रहे हैं, सब कुछ सही चल रहा है, लेकिन अचानक — बैम! — और स्टूडियो (या कंसोल) "incompatible version of Kotlin" और 1.5.1 और 1.1.16 जैसे कुछ संस्करणों के बारे में एक लंबा लाल संदेश दिखाता है। परिचित तस्वीर? यदि आपने कभी Android Studio, IntelliJ IDEA में Kotlin के साथ काम किया है या केवल Gradle के माध्यम से प्रोजेक्ट बनाया है, तो यह त्रुटि निश्चित रूप से आपको सिर पकड़ने पर मजबूर कर देगी।
\n\nअच्छी खबर: यह जल्दी और बिना किसी सर्जिकल हस्तक्षेप के हल हो जाती है। बुरी खबर: यदि आप इसे नहीं समझते हैं, तो यह बार-बार वापस आएगी। आज हम इस त्रुटि को विस्तार से समझेंगे, जानेंगे कि यह क्यों होती है, और इसे हमेशा के लिए भूल जाएंगे। चलिए शुरू करते हैं!
\n\nइस संदेश का वास्तव में क्या मतलब है?
\n\nआइए इसे "कंप्यूटर" भाषा से मानवीय भाषा में अनुवाद करें। Kotlin, किसी भी आधुनिक भाषा की तरह, लगातार विकसित हो रहा है। कंपाइलर का प्रत्येक नया संस्करण सुविधाएँ जोड़ता है, बग्स को ठीक करता है और... आंतरिक मेटाडेटा (बाइनरी फ़ाइलें जो आपकी कक्षाओं और फ़ंक्शनों का वर्णन करती हैं) के प्रारूप को बदलता है।
\n\nजब आप किसी तृतीय-पक्ष लाइब्रेरी (या अपने प्रोजेक्ट के मॉड्यूल) को कनेक्ट करते हैं, तो कंपाइलर जाँचता है: "क्या यह लाइब्रेरी Kotlin के उसी संस्करण के साथ संकलित की गई है?" और यदि लाइब्रेरी के मेटाडेटा का संस्करण (उदाहरण के लिए, 1.5.1) आपके वर्तमान कंपाइलर द्वारा अपेक्षित संस्करण (उदाहरण के लिए, 1.1.16) से मेल नहीं खाता है, तो यह उचित रूप से विरोध करता है। यह पुराने कैमरे से नए लैपटॉप में SD कार्ड डालने की कोशिश करने जैसा है — भौतिक रूप से फिट नहीं होता।
\n\nहमारे मामले में, त्रुटि कहती है: "लाइब्रेरी (मॉड्यूल) मेटाडेटा संस्करण 1.5.1 के साथ संकलित की गई है, और मैं (कंपाइलर) संस्करण 1.1.16 की अपेक्षा करता हूँ"। आमतौर पर इसका मतलब है कि आपके प्रोजेक्ट में Kotlin प्लगइन का संस्करण पुराना है या, इसके विपरीत, लाइब्रेरी बहुत नई है।
\n\nऐसा क्यों होता है? 3 मुख्य कारण
\n\n1. Gradle में संस्करणों की असंगति (सबसे आम)
\n\nक्या आपने कभी एक निर्भरता को अपडेट किया और Kotlin प्लगइन को अपडेट करना भूल गए? या इसके विपरीत — प्लगइन को अपडेट किया, लेकिन पुरानी लाइब्रेरीज़ को वैसे ही छोड़ दिया? कई मॉड्यूल वाले Android प्रोजेक्ट्स के लिए यह एक सामान्य स्थिति है।
\n\n// build.gradle (Project-level)\nplugins {\n id 'org.jetbrains.kotlin.android' version '1.5.1' apply false // प्लगइन नया है\n}\n\n// build.gradle (Module-level)\ndependencies {\n implementation 'com.some.library:old-lib:1.0.0' // और यह लाइब्रेरी Kotlin 1.1.16 के तहत संकलित है\n}\n\nकंपाइलर देखता है: प्लगइन — 1.5.1, लाइब्रेरी — पुरानी। और चिल्लाता है: "असंगति!"
\n\n2. मल्टी-मॉड्यूल प्रोजेक्ट्स में विरोध
\n\nयदि आपके प्रोजेक्ट में कई मॉड्यूल हैं (उदाहरण के लिए, app, core, feature), और प्रत्येक का अपना Kotlin संस्करण है — तो मुसीबत की उम्मीद करें। एक मॉड्यूल Kotlin 1.5.1 के साथ संकलित है, दूसरा — 1.1.16 के साथ। उन्हें जोड़ने का प्रयास करने पर वही त्रुटि दिखाई देती है।
3. JAR/AAR फ़ाइलों का "मैन्युअल" आयात
\n\nइंटरनेट से एक लाइब्रेरी डाउनलोड की और libs फ़ोल्डर में रख दी? बढ़िया, लेकिन यदि यह लाइब्रेरी आपके प्रोजेक्ट से भिन्न Kotlin संस्करण के तहत संकलित है — तो नमस्ते, त्रुटि।
कोड में यह कैसा दिखता है? समझने के लिए उदाहरण
\n\nआइए एक स्थिति का अनुकरण करें। आपके पास Kotlin 1.1.16 पर एक प्रोजेक्ट है (हाँ, पुराना है, लेकिन उदाहरण के लिए ठीक है)। आप एक लाइब्रेरी कनेक्ट करते हैं जो Kotlin 1.5.1 की नवीनतम सुविधाओं का उपयोग करती है।
\n\n// आपका कोड (Kotlin 1.1.16)\nfun main() {\n val result = SomeLibrary().doSomething() // त्रुटि!\n println(result)\n}\n\nऔर लाइब्रेरी के अंदर (संस्करण 1.5.1) उपयोग किया जाता है, मान लीजिए, inline fun interface या sealed interface, जो पुराने संस्करण में मौजूद ही नहीं हैं। कंपाइलर समझ नहीं पाता कि यह क्या है, और मेटाडेटा असंगति की त्रुटि देता है।
चरण-दर-चरण समाधान: सरल से जटिल तक
\n\nचरण 1. Kotlin प्लगइन का संस्करण जाँचें
\n\nअपने प्रोजेक्ट की रूट build.gradle (या build.gradle.kts) फ़ाइल खोलें। Kotlin संस्करण वाली पंक्ति खोजें:
//