Kotlin: كيفية إصلاح خطأ "Module was compiled with an incompatible version of Kotlin"

مدرب بايثون أونلاين للمبتدئين

تعلم Python بسهولة دون إرهاق نظري. حل مهام عملية مع التحقق التلقائي واكتب الكود مباشرة في المتصفح.

ابدأ الدورة

هل واجهت "Module was compiled with an incompatible version of Kotlin"? لست وحدك!

\n\n

تخيل: أنت تكتب كودًا بلغة Kotlin، كل شيء يعمل كالساعة، ولكن فجأة! — وتظهر لك الاستوديو (أو وحدة التحكم) رسالة حمراء طويلة بنص تهديدي حول "incompatible version of Kotlin" وبعض الإصدارات 1.5.1 و 1.1.16. مشهد مألوف؟ إذا كنت قد عملت مع Kotlin في Android Studio أو IntelliJ IDEA أو ببساطة قمت ببناء مشروع عبر 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 plugin في مشروعك قديم أو، على العكس، أن المكتبة جديدة جدًا.

\n\n

لماذا يحدث هذا؟ 3 أسباب رئيسية

\n\n

1. عدم تطابق الإصدارات في Gradle (الأكثر شيوعًا)

\n\n

هل سبق لك أن قمت بتحديث تبعية واحدة، متناسيًا تحديث Kotlin plugin نفسه؟ أو العكس — قمت بتحديث plugin، لكن المكتبات القديمة بقيت؟ هذا موقف نموذجي في مشاريع Android التي تحتوي على العديد من الوحدات.

\n\n
// build.gradle (على مستوى المشروع)\nplugins {\n    id 'org.jetbrains.kotlin.android' version '1.5.1' apply false // plugin جديد\n}\n\n// build.gradle (على مستوى الوحدة)\ndependencies {\n    implementation 'com.some.library:old-lib:1.0.0' // هذه المكتبة تم تجميعها تحت Kotlin 1.1.16\n}
\n\n

يرى المترجم: plugin — 1.5.1، المكتبة — قديمة. ويصرخ: "عدم توافق!"

\n\n

2. تعارض في المشاريع متعددة الوحدات

\n\n

إذا كان لديك مشروع يحتوي على عدة وحدات (مثل app و core و feature)، ولكل منها إصدار Kotlin خاص بها — فتوقع المشاكل. وحدة تم تجميعها مع Kotlin 1.5.1، وأخرى مع 1.1.16. عند محاولة ربطهما، يظهر نفس الخطأ.

\n\n

3. استيراد ملفات JAR/AAR "يدويًا"

\n\n

هل قمت بتنزيل مكتبة من الإنترنت ووضعتها في مجلد libs؟ رائع، ولكن إذا تم تجميع هذه المكتبة بإصدار Kotlin مختلف عن مشروعك — مرحبًا، خطأ.

\n\n

كيف يبدو هذا في الكود؟ مثال للفهم

\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

حل خطوة بخطوة: من البسيط إلى المعقد

\n\n

الخطوة 1. تحقق من إصدار Kotlin plugin

\n\n

افتح ملف build.gradle الجذر (أو build.gradle.kts) لمشروعك. ابحث عن السطر الذي يحتوي على إصدار Kotlin:

\n\n
//                

المدونات

توصيات الكتب