Встречали "Module was compiled with an incompatible version of Kotlin"? Вы не одиноки!
Представьте: вы пишете код на Kotlin, всё работает как часы, но вдруг — бац! — и студия (или консоль) выдает длинное красное сообщение с угрожающим текстом про "incompatible version of Kotlin" и какие-то версии 1.5.1 и 1.1.16. Знакомая картина? Если вы когда-либо работали с Kotlin в Android Studio, IntelliJ IDEA или просто собирали проект через Gradle, то эта ошибка наверняка заставляла вас хвататься за голову.
Хорошая новость: она решается быстро и без хирургического вмешательства. Плохая новость: если не разобраться, она будет возвращаться снова и снова. Сегодня мы разберем эту ошибку по косточкам, поймем, почему она возникает, и навсегда забудем о ней. Поехали!
Что вообще значит это сообщение?
Давайте переведём с "компьютерного" на человеческий. Kotlin, как и любой современный язык, постоянно развивается. Каждая новая версия компилятора добавляет фичи, исправляет баги и... меняет формат внутренних метаданных (бинарных файлов, которые описывают ваши классы и функции).
Когда вы подключаете стороннюю библиотеку (или модуль своего проекта), компилятор проверяет: "А той ли версией Kotlin эта библиотека скомпилирована?" И если версия метаданных библиотеки (например, 1.5.1) не совпадает с версией, которую ожидает ваш текущий компилятор (например, 1.1.16), он справедливо возмущается. Это как пытаться вставить SD-карту от старого фотоаппарата в новый ноутбук — физически не подходит.
В нашем случае ошибка говорит: "Библиотека (модуль) собрана с метаданными версии 1.5.1, а я (компилятор) ожидаю версию 1.1.16". Обычно это означает, что версия плагина Kotlin в вашем проекте устарела или, наоборот, библиотека слишком новая.
Почему это происходит? 3 главные причины
1. Разнобой версий в Gradle (самое частое)
Вы когда-нибудь обновляли одну зависимость, забыв обновить сам плагин Kotlin? Или наоборот — обновили плагин, а старые библиотеки остались? Типичная ситуация для Android-проектов с кучей модулей.
// build.gradle (Project-level)
plugins {
id 'org.jetbrains.kotlin.android' version '1.5.1' apply false // Плагин новый
}
// build.gradle (Module-level)
dependencies {
implementation 'com.some.library:old-lib:1.0.0' // А эта либа собрана под Kotlin 1.1.16
}
Компилятор видит: плагин — 1.5.1, библиотека — старая. И кричит: "Несовместимость!"
2. Конфликт в мультимодульных проектах
Если у вас проект с несколькими модулями (например, app, core, feature), и в каждом своя версия Kotlin — ждите беды. Один модуль собран с Kotlin 1.5.1, другой — с 1.1.16. При попытке их связать вылетает та самая ошибка.
3. "Ручной" импорт JAR/AAR файлов
Скачали библиотеку из интернета и положили в папку libs? Отлично, но если эта библиотека собрана под другую версию Kotlin, чем ваш проект — привет, ошибка.
Как это выглядит в коде? Пример для понимания
Давайте смоделируем ситуацию. У вас есть проект на Kotlin 1.1.16 (да, старьё, но для примера сойдёт). Вы подключаете библиотеку, которая использует новейшие фичи Kotlin 1.5.1.
// Ваш код (Kotlin 1.1.16)
fun main() {
val result = SomeLibrary().doSomething() // Ошибка!
println(result)
}
А внутри библиотеки (версия 1.5.1) используется, скажем, inline fun interface или sealed interface, которых в старой версии просто нет. Компилятор не понимает, что это за зверь, и выдаёт ошибку несовместимости метаданных.
Пошаговое решение: от простого к сложному
Шаг 1. Проверьте версию плагина Kotlin
Откройте корневой build.gradle (или build.gradle.kts) вашего проекта. Найдите строку с версией Kotlin:
// Для Groovy (build.gradle)
plugins {
id 'org.jetbrains.kotlin.android' version '1.9.0' apply false
}
// Для Kotlin DSL (build.gradle.kts)
plugins {
id("org.jetbrains.kotlin.android") version "1.9.0" apply false
}
Что делать: Убедитесь, что версия актуальна. Если стоит 1.1.16, а библиотеки требуют 1.5.1 — обновите плагин до 1.9.0 или выше. Важно: обновление плагина может потянуть за собой обновление Gradle и Android SDK, но это нормально.
Шаг 2. Синхронизируйте версии во всех модулях
Если у вас несколько модулей, пропишите версию Kotlin в корневом build.gradle, чтобы все модули её наследовали:
// Корневой build.gradle
ext {
kotlinVersion = '1.9.0'
}
// В каждом модуле
plugins {
id 'org.jetbrains.kotlin.android' version "$kotlinVersion"
}
Шаг 3. Обновите зависимости
Иногда проблема в том, что библиотека слишком старая. Проверьте, есть ли у неё новая версия, совместимая с вашим Kotlin. Если библиотека не обновлялась с 2018 года — возможно, пора найти альтернативу.
Шаг 4. Clean & Rebuild
Звучит банально, но помогает в 50% случаев. Gradle иногда кэширует старые бинарники. Сделайте:
./gradlew clean
./gradlew build
Или в Android Studio: Build → Clean Project, затем Build → Rebuild Project.
Шаг 5. Проверьте файл .kotlin_module
Если ничего не помогло, возможно, в вашем проекте затесался старый .kotlin_module файл. Удалите папки build и .gradle вручную, затем пересоберите проект.
Как не допустить ошибку в будущем?
Профилактика — лучшее лекарство. Вот три простых правила:
- Всегда используйте одну версию Kotlin