执行org.jetbrains.kotlin.gradle.internal.KaptExecution> java.lang.reflect.InvocationTargetException时发生故障(无错误消息)

时间:2020-08-29 17:07:00

标签: android kotlin android-room kotlin-coroutines

Android Studio给出了错误:

Execution failed for task ':app:kaptDebugKotlin'.
> A failure occurred while executing org.jetbrains.kotlin.gradle.internal.KaptExecution
   > java.lang.reflect.InvocationTargetException (no error message)

我想添加我的项目Kotlin Coroutines并将其与Room数据库一起使用。但是添加所有库后,我得到了这个错误。这些都是来自编译器的信息。

我已经确定,这是因为有@Database注释。如果我删除了此注释,则不会出现错误,但Room也不起作用。

我的gradle文件:

apply plugin: 'com.android.application'
apply plugin: 'kotlin-android'
apply plugin: 'kotlin-android-extensions'
apply plugin: 'kotlin-kapt'
//apply plugin: 'androidx.navigation.safeargs'

kotlin {
    experimental {
        coroutines 'enable'
    }
}

android {
    compileSdkVersion 29
    defaultConfig {
        applicationId "com.bestcred.coursetthree"
        minSdkVersion 21
        targetSdkVersion 29
        versionCode 1
        versionName "1.0"

        testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
        //vectorDrawables.useSupportLibrary = true
    }
    buildTypes {
        release {
            minifyEnabled false
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
        }
    }

    // Enables data binding.
    buildFeatures {
        dataBinding true
    }
}

dependencies {


    implementation "org.jetbrains.kotlin:kotlin-stdlib-jdk7:$kotlin_version"

    // Support libraries
    implementation "androidx.appcompat:appcompat:1.2.0"
    implementation 'com.google.android.material:material:1.2.0'
    implementation "androidx.fragment:fragment:1.2.5"
    implementation "androidx.constraintlayout:constraintlayout:2.0.0"

    // Android KTX
    implementation 'androidx.core:core-ktx:1.3.1'

    // Room and Lifecycle dependencies
    implementation "androidx.room:room-runtime:$room_version"
    implementation 'androidx.legacy:legacy-support-v4:1.0.0'
    kapt "android.arch.persistence.room:compiler:$room_version"

    // Kotlin Extensions and Coroutines support for Room
    implementation "androidx.room:room-ktx:$room_version"

    // Coroutines
    implementation "org.jetbrains.kotlinx:kotlinx-coroutines-core:$coroutine_version"
    implementation "org.jetbrains.kotlinx:kotlinx-coroutines-android:$coroutine_version"

}

kotlin_version = "1.4.0"
room_version = "2.2.5"
coroutine_version = '1.3.9'

我更新了Room版本并添加了Kotlin Coroutines。有什么问题?enter image description here

12 个答案:

答案 0 :(得分:23)

Android Studio的用户界面只是隐藏错误...

发生错误时,它会在列表视图中突出显示该项目,并在终端视图中显示无用的消息。 unhelpful error message appears when erroneous item is selected

要找到真正的错误,请在列表视图中选择根项,以便Android Studio在终端视图中显示整个构建输出,然后滚动以查找错误。 helpful error message appars when you select the root item from the list view on the left

答案 1 :(得分:3)

您需要更改:

kapt "android.arch.persistence.room:compiler:$room_version"

kapt "androidx.room:room-compiler:$room_version"

答案 2 :(得分:3)

如果您在房间数据库 Doa 实体类上犯了一些错误,就会发生此异常 例如我在实体类中犯了错误

  1. 我已将Entity类的自动生成字段设置为val而不是var
  2. 我在两个具有不同名称的函数上添加了删除批注,但是它们正在删除相同的数据

因此,如果您导入了正确的依赖项,我建议您仔细检查实体,dao或数据库类。

@Entity(tableName = "user_table")
data class User(
    val firstName: String,
    val lastName: String,
    val age: Int
) {
    @PrimaryKey(autoGenerate = true)
    var id: Int = 0 //**do not made it val**
}

答案 3 :(得分:3)

我在 Apple Silicon Macbook M1 上开发。

使用 room_version 2.2.4, 2.2.5 失败

def room_version = "2.2.4"

implementation "androidx.room:room-runtime:$room_version"
kapt "androidx.room:room-compiler:$room_version"
implementation "androidx.room:room-ktx:$room_version"
testImplementation "androidx.room:room-testing:$room_version"

答案 4 :(得分:1)

确保在数据库注释中包含所有实体

答案 5 :(得分:1)

此问题发生在包重命名 我已将所有文件从一个包拖放到另一个包中。

Objectbox 它创建了光标文件和实体文件(自动生成的文件)

不得不删除它们并重新构建。

连续吃了1个小时-_-

答案 6 :(得分:1)

我在 build.gradle 脚本文件中将 Room 版本从 2.2.5 更新到 2.3.0 或当前版本。构建成功。

答案 7 :(得分:1)

今天我遇到了这个错误。就我而言,我的笔记本电脑中同时安装了 java 11 和 java 16,java 16 是默认的。但是我项目中的 gradle 使用 java 11 来构建它。所以当我调用

$ gradle build

在我的终端中,它将使用 java 16,因此构建失败。我知道,正确的解决方案是使我的代码与 java 16 兼容,但是现在,我使用以下命令明确告诉 gradle 使用 java 11:

$ gradle build -Dorg.gradle.java.home=/usr/lib/jvm/java-11-openjdk-amd64 # warning: use te path to your java 11 

由于它是一个大命令,我将它保存在一个脚本文件中,因此只需运行脚本即可解决问题。

答案 8 :(得分:0)

我不得不将Room更新为最新的2.2.5,它已经解决了该问题。

答案 9 :(得分:0)

我也遇到过同样的问题。问题是因为我在Room DAO中使用了协程暂停函数,而没有实现必要的实现。以下对我有用,请尝试将现有的Room依赖项替换为:

def room_version = "2.2.5" //Use latest version

"androidx.room:room-runtime:$room_version"
"androidx.room:room-compiler:$room_version"
"androidx.room:room-ktx:$room_version"

如果上述方法不起作用,请转到“分析”->“检查代码”,并检查是否存在代码中断警告或错误(特定于房间)

答案 10 :(得分:0)

在我的例子中,我给了 insertAll() 和 delete() 函数的参数类型作为你的数据库的实体,错误解决

@Dao
interface NotesDao {

    @Insert
    fun insertAll(INotesEntity: NotesEntity) // argument type should be entity of your database

    @Delete
    fun delete(DNotesEntity: NotesEntity)    // argument type should be entity of your database

}

答案 11 :(得分:0)

我可能会迟到,但只有以下解决方案对我有用。

在 Android Studio 中打开 gradle.properties 文件。

添加以下几行:

kapt.use.worker.api=false
kapt.incremental.apt=false

清理并重新构建应用程序。

完成