Kotlin में अज्ञात विशेषता नाम MODULE: त्रुटि का विश्लेषण

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

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

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

भूत से मुलाकात: "unrecognized Attribute name MODULE" क्या है?

\n

क्या आपने कभी कोई ऐसी त्रुटि देखी है जो रहस्यमयी लगती है? कल्पना करें: आप आधुनिक Kotlin में लिख रहे हैं, सब कुछ ठीक चल रहा है, Gradle गुनगुना रहा है, और अचानक — बम! — लॉग में कुछ ऐसा दिखाई देता है:

\n
unrecognized Attribute name MODULE (class com.sun.tools.javac.util.SharedNameTable$NameImpl)
\n

आप गूगल करते हैं, हज़ारों व्यूज़ वाला Stack Overflow पाते हैं, और समझ जाते हैं: यह सिर्फ एक बग नहीं है। यह — दुनियाओं के बीच संगतता त्रुटि है। Java और Kotlin के बीच। पुरानी बिल्ड प्रणाली और नई मॉड्यूलर दुनिया के बीच।

\n

इस लेख में हम सिर्फ समाधान नहीं देंगे। हम Java कंपाइलर के अंदर झाँकेंगे, समझेंगे कि SharedNameTable क्या है, JVM MODULE शब्द पर क्यों आपत्ति करता है, और यह आपके Kotlin प्रोजेक्ट से कैसे संबंधित है। स्पॉइलर: दोष Kotlin का नहीं, बल्कि पुराने Gradle और Java 9+ का है।

\n\n

संक्षेप में: कैसे ठीक करें (अधीर लोगों के लिए)

\n

यदि आपको तुरंत बिल्ड ठीक करने की आवश्यकता है — यहाँ तीन काम के तरीके हैं। स्थिति के अनुसार चुनें:

\n
    \n
  • तरीका 1 (अनुशंसित): Gradle को संस्करण 7.0+ और Kotlin Gradle Plugin को 1.5+ में अपडेट करें। यह समस्या को हमेशा के लिए हल कर देगा।
  • \n
  • तरीका 2 (त्वरित समाधान): build.gradle.kts में स्पष्ट रूप से JVM लक्ष्य निर्दिष्ट करें:
  • \n
\n
kotlin {\n    jvmToolchain(11) // या 8, यदि पुरानी संगतता चाहते हैं\n}
\n
    \n
  • तरीका 3 (अस्थायी उपाय): कंपाइलर में फ़्लैग जोड़ें:
  • \n
\n
tasks.withType<KotlinCompile> {\n    kotlinOptions {\n        jvmTarget = "1.8"\n    }\n}
\n

लेकिन यदि आप समझना चाहते हैं कि यह क्यों काम करता है — आगे पढ़ें। हम Java कंपाइलर की गहराइयों में गोता लगाएँगे।

\n\n

अंदर की बात: com.sun.tools.javac.util.SharedNameTable$NameImpl क्या है?

\n

आइए इस डरावनी स्ट्रिंग को भागों में समझें। यह सिर्फ शब्दों का एक यादृच्छिक समूह नहीं है — यह Java Development Kit (JDK) के अंदर एक विशिष्ट वर्ग का संकेत है।

\n
    \n
  • com.sun.tools.javac — आंतरिक Java कंपाइलर (javac) का पैकेज। हाँ, वही जो .java को .class में बदलता है।
  • \n
  • util.SharedNameTable — एक सेवा वर्ग जो अनुकूलन के लिए स्ट्रिंग पूल में नाम (चर, विधियों, वर्गों के) संग्रहीत करता है। यह एक कैश है ताकि लाखों समान स्ट्रिंग न बनें।
  • \n
  • $NameImpl — एक आंतरिक वर्ग जो एक विशिष्ट नाम का प्रतिनिधित्व करता है। जब कंपाइलर module शब्द देखता है, तो यह NameImpl ऑब्जेक्ट बनाता है।
  • \n
\n

अब सबसे दिलचस्प बात: त्रुटि तब होती है जब javac class-फ़ाइल में MODULE विशेषता पर ठोकर खाता है, लेकिन उसे नहीं जानता कि उसके साथ क्या करना है। ऐसा तब होता है जब आप पुराने कंपाइलर (< Java 9) का उपयोग कर रहे हैं, या इसके विपरीत, नया कंपाइलर लेकिन पुराना class-फ़ाइल प्रारूप।

\n\n

MODULE एक विशेष शब्द क्यों है?

\n

Java 9 से शुरू होकर, भाषा में मॉड्यूल सिस्टम (Project Jigsaw) जोड़ा गया। कीवर्ड module आरक्षित हो गया। class-फ़ाइलों में नई विशेषताएँ जैसे Module, ModulePackages, ModuleMainClass आदि दिखाई दीं।

\n

जब Kotlin कंपाइलर बाइट-कोड उत्पन्न करता है, तो वह गलती से (या जानबूझकर) यह विशेषता जोड़ सकता है यदि आपका JVM लक्ष्य 9+ पर सेट है। और पुराना Gradle या Maven, javac के पुराने संस्करण का उपयोग करते हुए, इन विशेषताओं को नहीं समझता। यहीं से त्रुटि उत्पन्न होती है।

\n\n

वास्तविक उदाहरण: Kotlin + Gradle + Java 11

\n

एक सरल Kotlin प्रोजेक्ट की कल्पना करें जो Gradle पर है। यहाँ build.gradle.kts फ़ाइल है:

\n
plugins {\n    kotlin("jvm") version                

ब्लॉग

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