Avatar ·

Ошибка "unrecognized Attribute name MODULE" при сборке Kotlin/Android проекта

Всем привет! Я новичок в Kotlin и Android разработке. Перешёл на Java/Kotlin после Python, поэтому многое пока непонятно. У меня есть проект на Kotlin, который я собираю через Gradle. Внезапно при компиляции начала вылетать ошибка: ``` unrecognized Attribute name MODULE (class com.sun.tools.javac.util.SharedNameTable$NameImpl) ``` Я использую Android Studio, Gradle версии 7.4, плагин Kotlin 1.7.10. Вот мой простейший build.gradle.kts (модуль app): ```kotlin plugins { id("com.android.application") id("org.jetbrains.kotlin.android") } android { compileSdk = 33 defaultConfig { applicationId = "com.example.myapp" minSdk = 24 targetSdk = 33 versionCode = 1 versionName = "1.0" } buildTypes { release { isMinifyEnabled = false } } compileOptions { sourceCompatibility = JavaVersion.VERSION_11 targetCompatibility = JavaVersion.VERSION_11 } kotlinOptions { jvmTarget = "11" } } dependencies { implementation("androidx.core:core-ktx:1.9.0") implementation("androidx.appcompat:appcompat:1.5.1") } ``` Проект собирался нормально, но после обновления зависимостей (или после чистой переустановки Android Studio?) начала вылезать эта ошибка. Пробовал: - Invalidate Caches и перезапуск - clean/build - удаление .gradle папки - повышение/понижение версии Kotlin плагина - смена JDK с 11 на 17 Ничего не помогает. Ошибка возникает на этапе компиляции Kotlin кода. Что это за "MODULE" атрибут и как его убрать? Заранее спасибо! <<>>

Причина ошибки

Ошибка unrecognized Attribute name MODULE возникает из-за несовместимости между версией компилятора Kotlin (или Java) и версией библиотеки kotlin-stdlib (или её транзитивных зависимостей). Конкретно: атрибут MODULE появился в Java 9+ для модульной системы (JPMS). Если вы используете JDK 11 или 17, но в проекте задействована старая версия kotlin-stdlib (например, 1.4.x), которая сгенерирована для Java 8, то javac из более новой JDK может не распознать этот атрибут в байткоде. Однако в вашем случае проблема чаще всего вызвана конфликтом версий Kotlin компилятора и плагина Gradle.

На практике это означает, что у вас установлен Kotlin плагин 1.7.10, но вместе с ним в classpath попала более старая версия kotlin-stdlib (например, 1.5.x) или наоборот — более новая версия компилятора пытается обработать старые классы. Также это может быть связано с использованием compileOptions с Java 11, но при этом сам JDK, который использует Gradle, — Java 8 (или наоборот).

Решение: обновление kotlin-stdlib и синхронизация JDK

Самый надёжный способ — явно указать версию kotlin-stdlib в зависимостях и убедиться, что она совпадает с версией плагина. Также нужно проверить, какой JDK использует Gradle.

  1. Проверьте JDK в Android Studio: File → Project Structure → SDK Location → Gradle JDK. Поставьте JDK 11 или 17 (но не 8).
  2. Обновите build.gradle.kts модуля app:
plugins {
    id("com.android.application")
    id("org.jetbrains.kotlin.android") version "1.7.10"
}

android {
    compileSdk = 33

    defaultConfig {
        applicationId = "com.example.myapp"
        minSdk = 24
        targetSdk = 33
        versionCode = 1
        versionName = "1.0"
    }

    compileOptions {
        sourceCompatibility = JavaVersion.VERSION_11
        targetCompatibility = JavaVersion.VERSION_11
    }
    kotlinOptions {
        jvmTarget = "11"
    }
}

dependencies {
    // Явно укажите версию kotlin-stdlib
    implementation("org.jetbrains.kotlin:kotlin-stdlib:1.7.10")
    implementation("androidx.core:core-ktx:1.9.0")
    implementation("androidx.appcompat:appcompat:1.5.1")
}

Важно: Версия kotlin-stdlib должна совпадать с версией плагина (1.7.10). Если у вас в проекте есть другие модули, проверьте их build.gradle на предмет старых версий kotlin.

Альтернативное решение: понижение или повышение версии JDK

Если проблема осталась, попробуйте изменить JDK, который использует Gradle:

  • Переключитесь на JDK 17 (скачайте через Android Studio: SDK Manager → SDK Tools → Show Package Details → JDK 17).
  • Или наоборот — на JDK 11, если у вас стоит 17.

Также можно добавить в gradle.properties (в корне проекта) строку:

kotlin.stdlib.default.dependency=false

Это отключит автоматическое добавление kotlin-stdlib, и вы сможете управлять версией вручную.

Проверка транзитивных зависимостей

Иногда ошибку вызывают библиотеки, которые тянут старый kotlin-stdlib. Выполните в терминале:

./gradlew app:dependencies --configuration implementation

Посмотрите, нет ли там kotlin-stdlib:1.5.x или 1.6.x. Если есть — добавьте в dependencies:

implementation("org.jetbrains.kotlin:kotlin-stdlib:1.7.10") {
    force = true
}

Это принудительно заменит все версии на 1.7.10.

После всех изменений сделайте File → Invalidate Caches and Restart, затем Build → Clean Project и Build → Rebuild Project.

<<>>

Решение через обновление Gradle и Kotlin плагина

Иногда проблема решается простым обновлением версий. Ошибка unrecognized Attribute name MODULE может быть вызвана багом в старых версиях Gradle (ниже 7.0) или Kotlin плагина (ниже 1.6.0).

Попробуйте сделать следующее:

  1. Обновите Gradle wrapper до последней стабильной версии (например, 8.2). В файле gradle/wrapper/gradle-wrapper.properties замените:
distributionUrl=https\://services.gradle.org/distributions/gradle-8.2-all.zip
  1. Обновите Android Gradle Plugin (AGP) в корневом build.gradle.kts:
plugins {
    id("com.android.application") version "8.1.0" apply false
    id("org.jetbrains.kotlin.android") version "1.9.0" apply false
}
  1. Обновите Kotlin плагин в модуле app до версии 1.9.0 (или 1.8.20) и синхронизируйте проект.

После этого ошибка должна исчезнуть, так как новые версии Kotlin и Gradle корректно обрабатывают атрибут MODULE. Если нет — проверьте, не используете ли вы устаревшие библиотеки типа kotlin-stdlib-jdk8 (замените на kotlin-stdlib).

Дополнительно: в Android Studio можно переключить JDK на встроенный (File → Project Structure → SDK Location → Use embedded JDK). Это часто решает проблемы совместимости.