Почему возникает ошибка ‘Unable to find method getJvmDefault()’ при добавлении Room с KSP в Android проект на Kotlin? Как исправить эту проблему?
Ошибка ‘Unable to find method getJvmDefault()’ возникает при добавлении Room с KSP в Android проект на Kotlin из-за несовместимости версий между Android Gradle Plugin (AGP), KSP (Kotlin Symbol Processing), Kotlin и Room. Эта проблема связана с тем, что KSP1 устарел и не поддерживается для новых версий Kotlin 1.9.0+ и AGP 8.0+, поэтому необходимо либо точно согласовать версии зависимостей, либо перейти на KSP2.
Содержание
- Причины возникновения ошибки ‘Unable to find method getJvmDefault()’ при добавлении Room с KSP
- Проверка и обновление версий зависимостей для решения ошибки KSP Kotlin Android
- Конфигурация Room с KSP в Android проекте
- Переход на KSP2 как решение проблемы с Kotlin Android ошибка
- Полная правильная конфигурация Room с KSP
- Дополнительные шаги для устранения ошибки getJvmDefault
Причины возникновения ошибки ‘Unable to find method getJvmDefault()’ при добавлении Room с KSP
Ошибка "Unable to find method ‘KotlinJvmCompilerOptions.getJvmDefault()’ возникает из-за фундаментальной несовместимости между версиями инструментов в экосистеме Android разработки. Когда вы добавляете Room с KSP в свой проект, система сборки пытается использовать устаревший API KSP1, который больше не поддерживается в новых версиях Kotlin.
Главная проблема в том, что метод getJvmDefault() был удален или изменен в новых версиях Kotlin, но KSP1 все еще пытается к нему обратиться. Это создает конфликт между компилятором Kotlin и KSP процессором аннотаций. Room использует аннотации для генерации кода доступа к базе данных, а KSP должен их обрабатывать, но из-за несовместимости версии процессора не может найти требуемый метод.
Современный Android проект должен использовать согласованные версии всех компонентов:
- Android Gradle Plugin (AGP) - 8.2.2 или выше
- Kotlin - 1.9.22 или выше
- KSP - 1.9.22-1.0.17 для KSP1 или 2.0.0+ для KSP2
- Room - 2.8.4 или выше
Когда эти версии не согласованы, возникает ошибка getJvmDefault, которая блокирует компиляцию проекта и генерацию Room DAO классов.
Проверка и обновление версий зависимостей для решения ошибки KSP Kotlin Android
Первым шагом при решении проблемы ‘Unable to find method getJvmDefault()’ является тщательная проверка и обновление версий всех зависимостей в вашем проекте. Для решения Kotlin Android ошибка необходимо убедиться, что все компоненты имеют совместимые версии.
В файле project/build.gradle (или settings.gradle.kts для Gradle Kotlin DSL) проверьте плагины:
plugins {
id 'com.android.library' version '8.2.2' apply false
id 'org.jetbrains.kotlin.android' version '1.9.22' apply false
id("com.google.devtools.ksp") version '1.9.22-1.0.17' apply false
}
В файле app/build.gradle убедитесь, что плагины применяются правильно:
plugins {
id 'com.android.application'
id 'org.jetbrains.kotlin.android'
id("com.google.devtools.ksp")
}
Для Room базы данных Android используйте актуальную версию:
def room_version = "2.8.4"
dependencies {
implementation("androidx.room:room-runtime:$room_version")
ksp("androidx.room:room-compiler:$room_version")
// Дополнительные зависимости Room
implementation("androidx.room:room-ktx:$room_version")
}
Важно! Если вы используете KSP версии ниже 1.9.22-1.0.17 или Kotlin ниже 1.9.22, обязательно обновите их. Совместимость версий критична для решения проблемы с Room KSP Android. Несовпадение версий даже на одну минорную версию может вызвать ошибку getJvmDefault и другие проблемы компиляции.
Конфигурация Room с KSP в Android проекте
Правильная конфигурация Room с KSP требует внимания к деталям, чтобы избежать ошибки ‘Unable to find method getJvmDefault()’. Для Room базы данных Android с KSP необходимо настроить как минимум три основных компонента.
Во-первых, убедитесь, что ваши зависимости в app/build.gradle настроены правильно:
dependencies {
// Room зависимости
def room_version = "2.8.4"
implementation("androidx.room:room-runtime:$room_version")
ksp("androidx.room:room-compiler:$room_version")
// Для корутин поддержки
implementation("androidx.room:room-ktx:$room_version")
// ViewModel и LiveData
implementation("androidx.lifecycle:lifecycle-viewmodel-ktx:2.7.0")
implementation("androidx.lifecycle:lifecycle-livedata-ktx:2.7.0")
}
Во-вторых, настройте ваши DAO интерфейсы с правильными аннотациями:
@Dao
interface UserDao {
@Insert
suspend fun insertUser(user: User)
@Query("SELECT * FROM users")
fun getAllUsers(): Flow<List<User>>
@Update
suspend fun updateUser(user: User)
@Delete
suspend fun deleteUser(user: User)
}
В-третьих, создайте вашу Entity с правильными аннотациями:
@Entity(tableName = "users")
data class User(
@PrimaryKey(autoGenerate = true)
val id: Int = 0,
@ColumnInfo(name = "name")
val name: String,
@ColumnInfo(name = "email")
val email: String
)
Эта архитектура показывает, как Room генерирует DAO классы для доступа к базе данных. Ключевой момент здесь - что KSP должен правильно обработать аннотации @Entity, @Dao, @Query и другие, чтобы сгенерировать необходимый код. Ошибка getJvmDefault возникает именно на этапе обработки этих аннотаций KSP процессором.
Переход на KSP2 как решение проблемы с Kotlin Android ошибка
Наиболее надежным решением проблемы ‘Unable to find method getJvmDefault()’ является переход на KSP2. KSP2 является новой реализацией KSP API, которая быстрее и проще в использовании, чем KSP 1.x, и полностью совместима с современными версиями Kotlin и AGP.
Для миграции на KSP2 выполните следующие шаги:
- Обновите версию KSP в
project/build.gradle:
plugins {
id("com.google.devtools.ksp") version "2.0.0-1.0.24" apply false
}
- В
app/build.gradleнастройте KSP2:
plugins {
id("com.google.devtools.ksp")
}
ksp {
useKsp2 = true
}
- Убедитесь, что версии Kotlin и AGP совместимы с KSP2:
// В project/build.gradle
plugins {
id 'com.android.library' version '8.2.2' apply false
id 'org.jetbrains.kotlin.android' version '1.9.22' apply false
id("com.google.devtools.ksp") version "2.0.0-1.0.24" apply false
}
Важно отметить, что KSP1 устарел и будет удален в будущих версиях. Поэтому как можно скорее переходите на KSP2, чтобы избежать проблем с Room KSP Android в будущем. KSP2 решает не только ошибку getJvmDefault, но и улучшает производительность обработки аннотаций и стабильность сборки.
Полная правильная конфигурация Room с KSP
Для полной настройки Room с KSP без ошибки ‘Unable to find method getJvmDefault()’ используйте следующую конфигурацию:
- В файле
project/build.gradle:
plugins {
id 'com.android.library' version '8.2.2' apply false
id 'org.jetbrains.kotlin.android' version '1.9.22' apply false
id("com.google.devtools.ksp") version "2.0.0-1.0.24" apply false
}
- В файле
app/build.gradle:
plugins {
id 'com.android.application'
id 'org.jetbrains.kotlin.android'
id("com.google.devtools.ksp")
}
android {
namespace 'com.example.myapp'
compileSdk 34
defaultConfig {
applicationId "com.example.myapp"
minSdk 24
targetSdk 34
versionCode 1
versionName "1.0"
testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
}
buildTypes {
release {
minifyEnabled 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'
}
}
ksp {
useKsp2 = true
}
dependencies {
implementation 'androidx.core:core-ktx:1.12.0'
implementation 'androidx.appcompat:appcompat:1.6.1'
implementation 'com.google.android.material:material:1.11.0'
implementation 'androidx.constraintlayout:constraintlayout:2.1.4'
// Room зависимости
def room_version = "2.8.4"
implementation("androidx.room:room-runtime:$room_version")
ksp("androidx.room:room-compiler:$room_version")
implementation("androidx.room:room-ktx:$room_version")
// Lifecycle components
implementation("androidx.lifecycle:lifecycle-viewmodel-ktx:2.7.0")
implementation("androidx.lifecycle:lifecycle-livedata-ktx:2.7.0")
implementation("androidx.lifecycle:lifecycle-runtime-ktx:2.7.0")
// Testing
testImplementation 'junit:junit:4.13.2'
androidTestImplementation 'androidx.test.ext:junit:1.1.5'
androidTestImplementation 'androidx.test.espresso:espresso-core:3.5.1'
}
- Пример кода Room:
@Entity(tableName = "users")
data class User(
@PrimaryKey(autoGenerate = true)
val id: Int = 0,
@ColumnInfo(name = "name")
val name: String,
@ColumnInfo(name = "email")
val email: String
)
@Dao
interface UserDao {
@Insert
suspend fun insertUser(user: User)
@Query("SELECT * FROM users")
fun getAllUsers(): Flow<List<User>>
}
@Database(entities = [User::class], version = 1)
abstract class AppDatabase : RoomDatabase() {
abstract fun userDao(): UserDao
companion object {
@Volatile
private var INSTANCE: AppDatabase? = null
fun getDatabase(context: Context): AppDatabase {
return INSTANCE ?: synchronized(this) {
val instance = Room.databaseBuilder(
context.applicationContext,
AppDatabase::class.java,
"app_database"
).build()
INSTANCE = instance
instance
}
}
}
}
Эта полная конфигурация Room с KSP должна решить проблему ‘Unable to find method getJvmDefault()’ и обеспечить стабильную работу вашего Android проекта на Kotlin.
Дополнительные шаги для устранения ошибки getJvmDefault
Если после обновления версий и перехода на KSP2 ошибка ‘Unable to find method getJvmDefault()’ все еще возникает, выполните дополнительные шаги:
- Очистите проект и пересоберите его:
- В Android Studio: Build → Clean Project
- Затем: Build → Rebuild Project
- Или через командную строку:
./gradlew clean build
- Удалите
.gradleиbuilddirectories:
rm -rf .gradle
rm -rf app/build
rm -rf :app:build
- Проверьте наличие конфликтующих зависимостей в вашем проекте:
dependencies {
// Проверьте, нет ли дублирующихся зависимостей
implementation("androidx.room:room-runtime:2.5.0") // Старая версия
implementation("androidx.room:room-runtime:2.8.4") // Новая версия
}
- Убедитесь, что вы используете правильный синтаксис для KSP в Gradle:
// Правильно
ksp("androidx.room:room-compiler:2.8.4")
// Неправильно (может вызвать ошибки)
implementation("androidx.room:room-compiler:2.8.4")
- Проверьте, что все ваши Kotlin файлы используют правильный синтаксис аннотаций:
// Правильно
@Entity(tableName = "users")
data class User(...)
// Неправильно (может вызвать проблемы)
@Entity
data class User(...)
- Если вы используете модульную структуру проекта, убедитесь, что KSP правильно настроен во всех модулях, где используется Room.
Эти дополнительные шаги помогут彻底 устранить ошибку getJvmDefault и обеспечить корректную работу Room с KSP в вашем Android проекте на Kotlin.
Источники
- Android Developers — Официальная документация по Room архитектуре и настройке: https://developer.android.com/training/data-storage/room
- Hussain Shabbir — Решение ошибки getJvmDefault через обновление версий AGP, KSP и Kotlin: https://stackoverflow.com/questions/79934353/unable-to-find-method-kotlinjvmcompileroptions-getjvmdefault-android-studi
- mkrdmn — Информация о переходе на KSP2 как решение проблем с Gradle синхронизацией: https://stackoverflow.com/questions/79362573/gradle-sync-issues-android-kotlin-room-ksp
- Google KSP Team — Официальная информация о KSP2 и его преимуществах перед KSP1: https://github.com/google/ksp
Заключение
Ошибка ‘Unable to find method getJvmDefault()’ при добавлении Room с KSP в Android проект на Kotlin возникает из-за несовместимости версий между компонентами экосистемы. Основные решения включают обновление до совместимых версий AGP 8.2.2, Kotlin 1.9.22, KSP 1.9.22-1.0.17 или переход на KSP2 с версией 2.0.0-1.0.24.
Для решения Kotlin Android ошибка с Room базой данных Android рекомендуется как можно скорее перейти на KSP2, так как KSP1 устарел и не поддерживается в новых версиях. Правильная конфигурация зависимостей и использование ksp.useKsp2 = true в Gradle файле обеспечит стабильную работу вашего проекта без ошибки getJvmDefault.

На странице документации Android Developers по Room нет упоминания об ошибке «Unable to find method getJvmDefault()». В тексте описываются зависимости, примеры кода и архитектура Room, но информация о KSP и возникающих ошибках отсутствует.
Поэтому на основе данной страницы невозможно дать конкретное решение для данной ошибки. Если вам нужна помощь, стоит обратиться к другим источникам, где рассматривается конфигурация KSP и совместимость с Kotlin.
Ошибка “Unable to find method ‘KotlinJvmCompilerOptions.getJvmDefault()’” возникает из-за несовместимости версий между AGP, KSP, Kotlin и Room. Для решения проблемы необходимо точно согласовать версии всех зависимостей.
В файле project/build.gradle:
plugins {
id 'com.android.library' version '8.2.2' apply false
id 'org.jetbrains.kotlin.android' version '1.9.22' apply false
id("com.google.devtools.ksp") version '1.9.22-1.0.17' apply false
}
В файле app/build.gradle:
plugins {
id 'com.android.application'
id 'org.jetbrains.kotlin.android'
id("com.google.devtools.ksp")
}
def room_version = "2.8.4"
dependencies {
implementation("androidx.room:room-runtime:$room_version")
ksp("androidx.room:room-compiler:$room_version")
}
Проблема возникает при переходе с KAPT на KSP. KSP1 устарел и не поддерживается для новых версий Kotlin 2.3.0+ и AGP 9.0+. Рекомендуется использовать KSP2.
В корневом build.gradle:
plugins {
id("com.google.devtools.ksp") version "2.0.0-1.0.24" apply false
}
В app/build.gradle:
plugins {
id("com.google.devtools.ksp")
}
ksp {
useKsp2 = true
}
Для принудительного использования KSP2. KSP1 будет удален в будущих версиях, поэтому рекомендуется как можно скорее перейти на KSP2.

KSP2 является новой реализацией KSP API, которая быстрее и проще в использовании, чем KSP 1.x. Включен по умолчанию начиная с версии 2.0.0.
Для перехода на KSP2:
- Обновите версию KSP до 2.0.0 или выше
- Добавьте
ksp.useKsp2 = trueв конфигурацию - Убедитесь, что все зависимости совместимы с KSP2
KSP1 устарел и не поддерживается для новых версий Kotlin и AGP. Рекомендуется как можно скорее перейти на KSP2.