НейроАгент

Исправление ошибки несовместимости версий Kotlin Serialization

Решение ошибки 'Class kotlin.Unit was compiled with an incompatible version of Kotlin' при использовании kotlinx-serialization-json 1.9.0. Узнайте, как исправить несоответствия версий между Kotlin и библиотеками сериализации.

Как исправить ошибку “Class ‘kotlin.Unit’ was compiled with an incompatible version of Kotlin” при использовании kotlinx-serialization-json 1.9.0?

Я столкнулся с ошибкой компиляции после добавления зависимости kotlinx-serialization-json в мой Android-проект:

kotlin
implementation("org.jetbrains.kotlinx:kotlinx-serialization-json:1.9.0")

Сообщение об ошибке гласит:

Class 'kotlin.Unit' was compiled with an incompatible version of Kotlin. The actual metadata version is 2.2.0, but the compiler version 1.9.0 can read versions up to 2.0.0.
The class is loaded from /Users/user/.gradle/caches/modules-2/files-2.1/org.jetbrains.kotlin/kotlin-stdlib/2.2.0/fdfc65fbc42fda253a26f61dac3c0aca335fae96/kotlin-stdlib-2.2.0.jar!/kotlin/Unit.class

Я предпринял следующие шаги по устранению неполадок:

  • Сброс кэша и перезапуск
  • Обновление Gradle и TOML файлов
  • Запуск помощника по обновлению
  • Переход на последнюю версию Android Studio (2025.2.1)
  • Удаление проблемного jar-файла

Ошибка сохраняется, и исчезает только после удаления зависимости kotlinx-serialization-json и комментирования всех ссылок на сериализацию.

Вот конфигурация моего app build.gradle.kts:

kotlin
plugins {
    alias(libs.plugins.android.application)
    alias(libs.plugins.jetbrains.kotlin.android)
}

android {
    namespace = "com.sleepfuriously.paulsapp"
    compileSdk = 34

    defaultConfig {
        applicationId = "com.sleepfuriously.paulsapp"
        minSdk = 24
        targetSdk = 34
        versionCode = 4
        versionName = "1.12"

        testInstrumentationRunner = "androidx.test.runner.AndroidJUnitRunner"
        vectorDrawables {
            useSupportLibrary = true
        }
    }

    buildTypes {
        release {
            isMinifyEnabled = false
            proguardFiles(
                getDefaultProguardFile("proguard-android-optimize.txt"),
                "proguard-rules.pro"
            )
        }
    }
    compileOptions {
        sourceCompatibility = JavaVersion.VERSION_1_8
        targetCompatibility = JavaVersion.VERSION_1_8
    }
    kotlinOptions {
        jvmTarget = "1.8"
    }
    buildFeatures {
        compose = true
    }
    composeOptions {
        kotlinCompilerExtensionVersion = "1.5.1"
    }
    packaging {
        resources {
            excludes += "/META-INF/{AL2.0,LGPL2.1}"
        }
    }
}

dependencies {
    // ... другие зависимости ...
    
    // json сериализация
    implementation("org.jetbrains.kotlinx:kotlinx-serialization-json:1.9.0")
}

А мой libs.versions.toml включает:

toml
[versions]
kotlin = "1.9.0"
// ... другие версии ...

Как можно решить проблему несовместимости версий Kotlin и успешно использовать kotlinx-serialization-json в моем проекте?

НейроАгент

Ошибка возникает из-за того, что kotlinx-serialization-json 1.9.0 требует Kotlin 2.2.0, в то время как в вашем проекте используется Kotlin 1.9.0. Согласно документации Kotlin и релизам на GitHub, версия 1.9.0 kotlinx-serialization требует Kotlin 2.2.0, который introduces версию метаданных 2.2.0, которую ваш текущий компилятор Kotlin не может прочитать.


Содержание


Понимание несовместимости версий

Ошибка возникает из-за несоответствия версии метаданных между вашим компилятором Kotlin и библиотекой kotlinx-serialization-json. Согласно обсуждениям на Stack Overflow, при использовании kotlinx-serialization-json 1.9.0, она подтягивает зависимости, скомпилированные с Kotlin 2.2.0, но ваш проект использует Kotlin 1.9.0, который может читать метаданные только до версии 2.0.0.

Фактическая версия метаданных составляет 2.2.0, но компилятор версии 1.9.0 может читать версии до 2.0.0.

Эта несовместимость проявляется как ошибка “Класс ‘kotlin.Unit’ был скомпилирован с несовместимой версией Kotlin”.


Решение 1: Обновление Kotlin до 2.2.0

Рекомендуемый подход — обновить версию Kotlin до 2.2.0 для соответствия требованиям kotlinx-serialization 1.9.0.

Обновите ваш файл libs.versions.toml:

toml
[versions]
kotlin = "2.2.0"
# Обновите другие версии при необходимости для совместимости с Kotlin 2.2.0

Обновите ваш файл app build.gradle.kts:

kotlin
android {
    // ... существующая конфигурация ...
    
    compileOptions {
        sourceCompatibility = JavaVersion.VERSION_1_8
        targetCompatibility = JavaVersion.VERSION_1_8
    }
    kotlinOptions {
        jvmTarget = "1.8"
    }
    composeOptions {
        // Обновите версию компилятора Compose для Kotlin 2.2.0
        kotlinCompilerExtensionVersion = "1.5.8" // или совместимая версия
    }
}

Добавьте плагин Kotlin сериализации:

kotlin
plugins {
    alias(libs.plugins.android.application)
    alias(libs.plugins.jetbrains.kotlin.android)
    kotlin("plugin.serialization") version "2.2.0" // Добавьте эту строку
}

Это решение обеспечивает совместимость между вашим компилятором Kotlin и библиотекой сериализации.


Решение 2: Использование совместимой версии сериализации

Если вы предпочитаете остаться на Kotlin 1.9.0, используйте более старую версию kotlinx-serialization, совместимую с ней.

Обновите вашу зависимость:

kotlin
dependencies {
    // Используйте версию 1.6.3 вместо 1.9.0
    implementation("org.jetbrains.kotlinx:kotlinx-serialization-json:1.6.3")
}

Согласно Stack Overflow, версии 1.6.x совместимы с Kotlin 1.9.x:

Для библиотеки JSON версии 1.6.x соответствуют версиям Kotlin 1.9.x (документация). Самая последняя — 1.6.3, которую вы можете использовать.

Этот подход позволяет сохранить текущую версию Kotlin, продолжая использовать функциональность сериализации.


Решение 3: Проверка конфигурации плагина

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

Проверьте структуру вашего build.gradle.kts:

kotlin
plugins {
    alias(libs.plugins.android.application)
    alias(libs.plugins.jetbrains.kotlin.android)
    kotlin("plugin.serialization") version "2.2.0" // Убедитесь, что версия соответствует Kotlin
}

android {
    // ... существующая конфигурация ...
}

dependencies {
    implementation("org.jetbrains.kotlinx:kotlinx-serialization-json:1.9.0")
}

Проверьте ваш файл libs.versions.toml:

toml
[versions]
kotlin = "2.2.0"
kotlinx-serialization = "1.9.0"

[libraries]
kotlinx-serialization-json = { group = "org.jetbrains.kotlinx", name = "kotlinx-serialization-json", version.ref = "kotlinx-serialization" }

[plugins]
kotlin-android = { id = "org.jetbrains.kotlin.android", version.ref = "kotlin" }
kotlin-serialization = { id = "org.jetbrains.kotlin.plugin.serialization", version.ref = "kotlin" }

Это гарантирует, что все компоненты, связанные с Kotlin, используют согласованные версии.


Дополнительные шаги по устранению неполадок

Если приведенные выше решения не решают проблему, попробуйте эти дополнительные шаги:

1. Очистите и пересоберите проект:

bash
./gradlew clean build --rerun-tasks

2. Проверьте конфликтующие зависимости:

kotlin
// В вашем build.gradle.kts
configurations.all {
    resolutionStrategy {
        force("org.jetbrains.kotlin:kotlin-stdlib:2.2.0")
    }
}

3. Обновите Gradle wrapper:

Убедитесь, что вы используете совместимую версию Gradle (8.0 или новее) для Kotlin 2.2.0.

4. Очистите кэш Gradle:

bash
./gradlew --stop
rm -rf ~/.gradle/caches/

5. Проверьте транзитивные зависимости:

Используйте ./gradlew :app:dependencies для просмотра дерева зависимостей и выявления конфликтующих версий.


Лучшие практики управления версиями

Матрица совместимости версий:

Версия Kotlin Версия kotlinx-serialization
1.9.x 1.6.x
2.0.x 1.6.x
2.2.x 1.9.x

Регулярные обновления:

  • Следите за анонсами совместимости в релизах Kotlin
  • Используйте version catalogs для последовательного управления зависимостями
  • Рассмотрите использование Android Tools для управления версиями

Многомодульные проекты:

В сложных проектах убедитесь, что все модули используют согласованные версии Kotlin и сериализации. Как отмечается в обсуждениях на GitHub, несоответствия версий между модулями могут вызывать аналогичные проблемы.


Источники

  1. Документация Kotlin - Сериализация
  2. GitHub - Релизы Kotlinx Serialization
  3. Stack Overflow - Совместимость Kotlinx Serialization
  4. Stack Overflow - Руководство по совместимости версий
  5. GitHub - Changelog Kotlinx Serialization

Заключение

Чтобы решить ошибку “Класс ‘kotlin.Unit’ был скомпилирован с несовместимой версией Kotlin”:

  1. Обновитесь до Kotlin 2.2.0 — Это рекомендуемое решение, так как оно полностью поддерживает kotlinx-serialization 1.9.0
  2. Используйте kotlinx-serialization 1.6.3 — Если вы предпочитаете остаться на Kotlin 1.9.x
  3. Обеспечьте согласованность плагинов — Убедитесь, что все плагины, связанные с Kotlin, используют совместимые версии
  4. Очистите и пересоберите — После внесения изменений в версии выполните очистку и пересборку
  5. Проверьте конфликты зависимостей — Используйте анализ дерева зависимостей Gradle для выявления несоответствий версий

Ключевой вывод — поддержание совместимости версий во всех зависимостях и плагинах, связанных с Kotlin. Начало с Kotlin 2.2.0 и kotlinx-serialization 1.9.0 предоставляет наиболее современное и функционально богатое решение, в то время как использование более старой версии сериализации предлагает стабильный путь, если вы не готовы обновлять версию Kotlin.