परिचय: KaptExecution बिल्ड को क्यों तोड़ता है और इसे कैसे ठीक करें
\n\nयदि आपने कभी A failure occurred while executing org.jetbrains.kotlin.gradle.internal.KaptExecution त्रुटि का सामना किया है, तो आप जानते हैं कि यह कितना परेशान करने वाला होता है। बिल्ड फेल हो जाता है, Gradle लाल टेक्स्ट दिखाता है, और लॉग में समझ से बाहर के stacktraces होते हैं। Stack Overflow पर इस प्रश्न को हजारों बार देखा गया है, लेकिन अधिकांश उत्तर केवल "कैश साफ़ करने का प्रयास करें" होते हैं। हम इससे आगे जाएंगे।
इस लेख में, हम केवल तैयार समाधान नहीं देंगे। हम Kapt (Kotlin Annotation Processing Tool) तंत्र के हुड के नीचे झांकेंगे और समझेंगे कि जब Gradle KaptExecution चलाता है तो वास्तव में क्या होता है। आप जानेंगे कि कोड जनरेशन कैसे काम करता है, सामान्य त्रुटियाँ कहाँ छिपी होती हैं और उन्हें कैसे रोका जाए। और सबसे महत्वपूर्ण बात, आपको Kotlin में काम करने वाले उदाहरण मिलेंगे जिन्हें आप तुरंत अपने प्रोजेक्ट में लागू कर सकते हैं।
यह pythonlib.ru के लिए एक शैक्षिक सामग्री है, जो उन डेवलपर्स के लिए अनुकूलित है जो केवल कमांड कॉपी नहीं करना चाहते, बल्कि समझना चाहते हैं कि बिल्डर के अंदर क्या हो रहा है।
\n\nKaptExecution क्या है और इसकी आवश्यकता क्यों है
\n\nKapt Kotlin के लिए एक प्लगइन है जो Kotlin प्रोजेक्ट्स में Java-संगत annotation processors (जैसे Dagger, Room, Glide, Moshi) का उपयोग करने की अनुमति देता है। जब आप @Inject या @Entity एनोटेशन लिखते हैं, तो कंपाइलर अतिरिक्त कोड (क्लास, फैक्ट्री, DAO) उत्पन्न करता है।
Gradle के अंदर, Kapt एक अलग कार्य के रूप में काम करता है। जब आप बिल्ड चलाते हैं, तो Gradle KaptExecution को कॉल करता है - यह एक कमांड है जो एनोटेशन प्रोसेसिंग सक्षम के साथ Kotlin कंपाइलर चलाता है। यदि इस चरण में कुछ गलत होता है (उदाहरण के लिए, processor ने अपवाद फेंका या मेमोरी खत्म हो गई), तो आपको वही त्रुटि दिखाई देती है।
Gradle में KaptExecution कैसा दिखता है
\n\nbuild.gradle.kts (या build.gradle) फ़ाइल में, Kapt इस प्रकार जोड़ा जाता है:
plugins {\n kotlin("kapt") version "1.9.0"\n}\n\ndependencies {\n kapt("com.google.dagger:dagger-compiler:2.48")\n}\n\n\nजब आप ./gradlew build चलाते हैं, तो Gradle एक चाइल्ड Java/Kotlin प्रक्रिया बनाता है जो KaptExecution को निष्पादित करती है। इस समय, annotation processors लोड होते हैं, एनोटेशन पार्स किए जाते हैं और build/generated/source/kapt फ़ोल्डर में फ़ाइलें उत्पन्न होती हैं।
KaptExecution त्रुटि के मुख्य कारण
\n\nयह त्रुटि विभिन्न कारकों के कारण हो सकती है। आइए सबसे सामान्य परिदृश्यों पर विचार करें।
\n\n1. Kotlin और Kapt के संस्करणों का विरोध
\n\nKapt Kotlin Gradle Plugin का हिस्सा है। यदि प्लगइन का संस्करण Kotlin के संस्करण से मेल नहीं खाता है, तो processor विफल हो सकता है। उदाहरण के लिए:
\n\n// गलत\nplugins {\n kotlin("jvm") version "1.8.20"\n kotlin("kapt") version "1.9.0" // विरोध\n}\n\n\nसमाधान: संस्करण समान होने चाहिए।
\n\n2. annotation processing के लिए अपर्याप्त मेमोरी
\n\nKaptExecution एक अलग JVM प्रक्रिया चलाता है। यदि आप बहुत सारे एनोटेशन प्रोसेस कर रहे हैं (उदाहरण के लिए, दर्जनों संस्थाओं वाला Room), तो heap अपर्याप्त हो सकता है। लॉग में आपको OutOfMemoryError दिखाई देगा।
समाधान: gradle.properties में Gradle daemon के लिए मेमोरी बढ़ाएँ:
org.gradle.jvmargs=-Xmx4g -XX:MaxPermSize=512m\nkapt.use.worker.api=false\n\n\n3. annotation processor में बग
\n\nकभी-कभी processor में ही (उदाहरण के लिए, Dagger या Room का पुराना संस्करण) त्रुटियाँ होती हैं। वे केवल कोड की कुछ विशिष्ट संरचनाओं पर ही प्रकट होती हैं।
\n\nउदाहरण: Dagger में चक्रीय निर्भरता KaptExecution के अंदर StackOverflowError का कारण बन सकती है।
// समस्याग्रस्त कोड का उदाहरण\n@Module\nclass MyModule {\n @Provides\n fun provideA(b: B): A = A(b)\n\n @Provides\n fun provideB(a: A): B = B(a) // चक्रीय निर्भरता\n}\n\n\nKaptExecution Circular dependency detected संदेश के साथ विफल हो जाएगा। समाधान - निर्भरता ग्राफ को पुनः डिज़ाइन करें।