Avatar ·

Предупреждение «Версия плагина Kotlin не совпадает с версией библиотеки» (хотя они одинаковые)

Всем привет! Я новичок в Android-разработке на Kotlin, и у меня возникла странная проблема. Я обновил свой проект до Kotlin 1.9.0. Изменил версию в `build.gradle.kts` (project-level) и в `build.gradle.kts` (app-level). Вот как выглядят мои файлы: **project/build.gradle.kts:** ```kotlin plugins { id("com.android.application") version "8.1.2" apply false id("org.jetbrains.kotlin.android") version "1.9.0" apply false } ``` **app/build.gradle.kts:** ```kotlin plugins { id("com.android.application") id("org.jetbrains.kotlin.android") } android { compileSdk = 34 defaultConfig { applicationId = "com.example.myapp" minSdk = 24 targetSdk = 34 versionCode = 1 versionName = "1.0" } } dependencies { implementation("org.jetbrains.kotlin:kotlin-stdlib:1.9.0") implementation("androidx.core:core-ktx:1.12.0") // ... другие зависимости } ``` После синхронизации Gradle я получаю предупреждение в Android Studio: ``` Warning: Kotlin plugin version (1.9.0) is not the same as library version (1.9.0) ``` При этом версии везде указаны одинаковые — 1.9.0! Я перепроверил несколько раз. Не могу понять, в чем дело. Проект собирается, но это предупреждение раздражает. Как от него избавиться? Может быть, я что-то неправильно настроил? Заранее спасибо за помощь! <<>>

Причина предупреждения: скрытые транзитивные зависимости

Ваше предупреждение возникает из-за того, что некоторые библиотеки (например, androidx.core:core-ktx:1.12.0) приносят с собой свою версию Kotlin stdlib как транзитивную зависимость. Даже если вы явно указали kotlin-stdlib:1.9.0, Gradle может подтянуть другую версию из-за конфликта или приоритета зависимостей.

Решение: принудительное разрешение версий

Самый надёжный способ — явно указать Gradle, какую версию Kotlin stdlib использовать, переопределив все транзитивные версии. Добавьте в ваш app/build.gradle.kts блок configurations.all:

// app/build.gradle.kts
configurations.all {
    resolutionStrategy {
        force("org.jetbrains.kotlin:kotlin-stdlib:1.9.0")
        force("org.jetbrains.kotlin:kotlin-stdlib-jdk7:1.9.0")
        force("org.jetbrains.kotlin:kotlin-stdlib-jdk8:1.9.0")
        force("org.jetbrains.kotlin:kotlin-reflect:1.9.0")
    }
}

Это заставит Gradle использовать версию 1.9.0 для всех артефактов Kotlin, независимо от того, что просят библиотеки.

Альтернатива: проверка дерева зависимостей

Выполните в терминале команду, чтобы увидеть, какие версии Kotlin подтягиваются на самом деле:

./gradlew :app:dependencies --configuration debugRuntimeClasspath | grep kotlin

В выводе вы увидите что-то вроде:

org.jetbrains.kotlin:kotlin-stdlib:1.8.10 -> 1.9.0
org.jetbrains.kotlin:kotlin-stdlib-jdk8:1.8.10 -> 1.9.0

Стрелка означает, что Gradle уже разрешил конфликт в пользу 1.9.0, но предупреждение всё равно может появляться из-за того, что плагин и библиотека проверяются на разных этапах сборки.

Если предупреждение остаётся

  • Обновите Android Studio — в старых версиях мог быть баг с ложными предупреждениями.
  • Проверьте версию плагина Kotlin в Android Studio: File → Settings → Languages & Frameworks → Kotlin. Убедитесь, что она совпадает с версией в Gradle (1.9.0).
  • Очистите кеш: Build → Clean Project, затем File → Invalidate Caches and Restart.

Профилактика на будущее

Чтобы избежать таких проблем, используйте BOM (Bill of Materials) для Kotlin, если ваш проект это поддерживает. Например, с Kotlin 1.9.0+ и Android Gradle Plugin 8.1+ можно сделать так:

// project/build.gradle.kts
plugins {
    id("com.android.application") version "8.1.2" apply false
    id("org.jetbrains.kotlin.android") version "1.9.0" apply false
    id("org.jetbrains.kotlin.plugin.compose") version "1.9.0" apply false // если используете Compose
}

И в app/build.gradle.kts просто не указывайте kotlin-stdlib явно — плагин сам подставит нужную версию. Но это работает только если все библиотеки в проекте совместимы с этой версией.

<<>>

Упрощённое решение: удалите явную зависимость kotlin-stdlib

Чаще всего предупреждение возникает, потому что вы вручную добавляете implementation("org.jetbrains.kotlin:kotlin-stdlib:1.9.0") в dependencies. Плагин Kotlin для Gradle (org.jetbrains.kotlin.android) автоматически добавляет stdlib нужной версии во время компиляции. Явное указание может создать дублирование или конфликт.

Попробуйте просто удалить эту строку из app/build.gradle.kts:

dependencies {
    // Удалите эту строку:
    // implementation("org.jetbrains.kotlin:kotlin-stdlib:1.9.0")
    
    implementation("androidx.core:core-ktx:1.12.0")
    // ... остальные зависимости
}

После этого сделайте синхронизацию Gradle (File → Sync Project with Gradle Files). В большинстве случаев предупреждение исчезает, потому что плагин сам управляет версией stdlib, и она гарантированно совпадает с версией плагина.

Когда это не работает

Если предупреждение остаётся, значит одна из ваших библиотек (например, androidx.core:core-ktx) тянет старую версию stdlib через транзитивные зависимости. В этом случае используйте метод force() из первого ответа или обновите все библиотеки до последних версий, совместимых с Kotlin 1.9.0.