Gradle की JVM-संगतता: Kotlin 1.8 और Java 11 को कैसे मित्र बनाएं

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

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

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

आपका Kotlin और Java प्रोजेक्ट अचानक क्यों 'टूट' जाता है?

\n\n

क्या आपने कभी ऐसी स्थिति का सामना किया है जब आप Kotlin में कोड लिख रहे हों, मुख्य कोड के लिए Java 11 का उपयोग कर रहे हों, और Gradle अचानक संगतता त्रुटि दे दे? परिचित लगता है? मल्टी-मॉड्यूल प्रोजेक्ट्स को सेट करते समय यह सबसे आम समस्याओं में से एक है। खासकर जब आप build.gradle.kts (Kotlin DSL) का उपयोग करते हैं और compileJava को compileKotlin के साथ मित्र बनाने की कोशिश करते हैं। इस लेख में, हम समझेंगे कि Java 11 और Kotlin 1.8 के लिए jvm target compatibility को सही तरीके से कैसे सेट करें, ताकि आपका प्रोजेक्ट बिना किसी त्रुटि के बिल्ड हो। और हाँ, हम इसे हिंदी में, हास्य के साथ और बिना उबाऊ सिद्धांत के करेंगे।

\n\n

यदि आप Stack Overflow से आए हैं, तो आप जानते हैं कि मूल प्रश्न को हज़ारों बार देखा गया है। हम इसे शैक्षिक प्रारूप में ढाल रहे हैं, ताकि आप केवल उत्तर कॉपी न करें, बल्कि समझें कि त्रुटि क्यों होती है और भविष्य में इससे कैसे बचा जाए।

\n\n

समस्या: जब Java और Kotlin अलग-अलग भाषाएँ बोलते हैं

\n\n

कल्पना करें कि Java 11 एक सख्त प्रोफेसर है, जो चाहता है कि सब कुछ मानक के अनुसार हो। और Kotlin 1.8 उसका रचनात्मक सहकर्मी है, जो नई सुविधाओं का उपयोग करना चाहता है, लेकिन प्रोफेसर को बताना भूल जाता है। परिणाम - संघर्ष।

\n\n

Gradle में, प्रत्येक संकलन कार्य (compileJava, compileKotlin) का अपना JVM target होता है - बाइटकोड का वह संस्करण जिसमें कोड संकलित होता है। यदि वे मेल नहीं खाते हैं, तो आपको इस तरह की त्रुटि मिलेगी:

\n\n
Error: Module was compiled with an incompatible version of Kotlin. The binary version of its metadata is 1.8.0, expected version is 1.6.0.\n
\n\n

या, इससे भी बुरा, बाइटकोड असंगतता के कारण प्रदर्शन में मूक गिरावट।

\n\n

यह विशेष रूप से build.gradle.kts में क्यों होता है?

\n\n

Kotlin DSL (.gradle.kts फ़ाइलें) एक शक्तिशाली उपकरण है, लेकिन इसमें मापदंडों के स्पष्ट उल्लेख की आवश्यकता होती है। Groovy DSL के विपरीत, जहाँ कुछ सेटिंग्स स्वचालित रूप से 'पकड़' ली जाती हैं, Kotlin DSL में सटीक होना आवश्यक है। यह विशेष रूप से jvm target पर लागू होता है।

\n\n

सामान्य गलती: आप java.targetCompatibility = JavaVersion.VERSION_11 सेट करते हैं, लेकिन Kotlin के लिए भी ऐसा ही सेट करना भूल जाते हैं। या इसके विपरीत - आप compileKotlin सेट करते हैं, और compileJava Java 8 पर रह जाता है।

\n\n

सही समाधान: Java और Kotlin के लिए एकीकृत JVM target

\n\n

त्रुटियों से बचने के लिए, दोनों कार्यों के लिए स्पष्ट रूप से jvm target सेट करना आवश्यक है। build.gradle.kts में इसे करने का तरीका यहाँ बताया गया है:

\n\n

चरण 1. Java सेटअप (compileJava)

\n\n

java {} ब्लॉक या tasks.withType<JavaCompile>() में जोड़ें:

\n\n
java {\n    sourceCompatibility = JavaVersion.VERSION_11\n    targetCompatibility = JavaVersion.VERSION_11\n}\n\ntasks.withType<JavaCompile>() {\n    options.encoding = "UTF-8"\n    options.compilerArgs.add("-parameters")\n}\n
\n\n

ध्यान दें: sourceCompatibility और targetCompatibility समान होने चाहिए। यदि आप Java 11 में कोड लिख रहे हैं, तो बाइटकोड भी Java 11 का होना चाहिए।

\n\n

चरण 2. Kotlin सेटअप (compileKotlin)

\n\n

अब सबसे महत्वपूर्ण - Kotlin के लिए jvm target सेट करें। यह kotlin {} ब्लॉक या tasks.withType<KotlinCompile>() के माध्यम से किया जाता है:

\n\n
import org.jetbrains.kotlin.gradle.tasks.KotlinCompile\n\ntasks.withType<KotlinCompile>() {\n    kotlinOptions {\n        jvmTarget = "11"  // ध्यान दें: यह एक स्ट्रिंग है, JavaVersion नहीं!\n        apiVersion = "1.8"\n        languageVersion = "1.8"\n    }\n}\n
\n\n

jvmTarget एक स्ट्रिंग क्यों है? क्योंकि Kotlin संस्करण के स्ट्रिंग प्रतिनिधित्व की अपेक्षा करता है (उदाहरण के लिए, "1.8", "11", "17")। यदि आप JavaVersion.VERSION_11 पास करने का प्रयास करते हैं, तो कंपाइलर एक त्रुटि देगा।

\n\n

build.gr का पूरा उदाहरण

ब्लॉग

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