执行org.jetbrains.kotlin.gradle.internal.KaptExecution时发生故障


130

突然我开始收到此错误,而我却不知道为什么如果有人让我知道此错误在哪里,将足够有帮助。由于android studio的新更新,我能得到的就是这个。我得到的错误的详细摘要。

Task :app:kaptDebugKotlin
    ANTLR Tool version 4.5.3 used for code generation does not match the current runtime version 4.7.1ANTLR Runtime version 4.5.3 used for parser compilation does not match the current runtime version 4.7.1ANTLR Tool version 4.5.3 used for code generation does not match the current runtime version 4.7.1ANTLR Runtime version 4.5.3 used for parser compilation does not match the current runtime version 4.7.1C:\Users\shubh\Downloads\MarginCalculator\app\build\generated\source\kapt\debug\com\kotlin_developer\margincalculator\DataBinderMapperImpl.java:10: error: cannot find symbol
    import com.kotlin_developer.margincalculator.databinding.FragmentCalculatorScreenBindingImpl;

    symbol:   class FragmentCalculatorScreenBindingImpl

    Task :app:kaptDebugKotlin FAILED
    location: package com.kotlin_developer.margincalculator.databinding
    FAILURE: Build failed with an exception.

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

* Try:
Run with --stacktrace option to get the stack trace. Run with --info or --debug option to get more log output. Run with --scan to get full insights.

* Get more help at https://help.gradle.org

BUILD FAILED in 17s
29 actionable tasks: 27 executed, 2 up-to-date

请在build.gradle文件中显示您的代码。
谢尔盖(Sergey)

请同时显示DataBinderMapperImpl.java代码。
谢尔盖

3
您是否已更新至Android Studio 4?同样的铅在这里
Samuel Eminet

2
我更新到Android Studio 4,使用Room时遇到了同样的错误,我可以通过更改查询之一来临时修复它。我最初有以下查询:“ SELECT case_name FROM SavedCases”,然后将其更改为“ SELECT * FROM SavedCases”,错误消息消失了。由于某种原因,当我仅尝试查询特定列时,只会出现此错误。这不是解决此问题的理想方法,我希望有人可以提供更好的解决方法。
哈尼

我遇到了类似的错误,找到了适合我的解决方案。您可能已经做了类似的事情。stackoverflow.com/questions/63133657/…–
Mustaqode

Answers:


198

Android Studio的UI只是隐藏了错误...

当发生错误时,它会在列表视图中突出显示该项目,并在终端视图中显示一条无用的消息。 不好不好

要找到真正的错误,请在列表视图中选择根项,以便Android Studio在终端视图中显示整个构建输出,然后滚动查找错误。 好好


6
如果你有一个编译时间(DB)的错误,它会显示它这样的-这意味着一个或一些你的疑问是错误的
伊詹Damri

我想对于任何编译时数据库错误,它都会像这样显示...在我的情况下,这是关于错误设置实体对象的编译时领域DB错误...
Eric

1
从支持者的角度来看,UI的决定不是一个好选择
Daniel Wilson

1
这应该标记为正确答案
Mike6679

56

也许我对答案有点迟了,但是无论如何,我遇到了同样的错误。构建失败可能是由Android Studio未能指出的一些错误引起的,可能是由于项目规模很大。

这是指出确切错误的简单方法。

  1. 在Android Studio中,转到“分析”菜单,然后单击“检查代码”;检查整个项目,单击“确定”,然后等待检查完成。

    检查代码

  2. 现在,您将看到一个标签,其中包含所有错误,警告等,您现在可以解决实际问题。

    错误标签


2
是的,它确实显示错误。(我在XML中犯了一个错误)
Hari Shankar S

2
我不明白为什么Android Studio在构建失败时不直接显示错误,这没有任何意义。谢谢,这对我有很大帮助
moyo

34

找出根本问题的方法是运行以下命令:

./gradlew assembleDebug --stacktrace

17

我遇到了同样的问题,所以我试图通过这样做来获取更多信息

gradle->应用程序->任务->构建->汇编

在此之后,我得到确切的错误,说“注释处理时出错”。我检查了最近调整过的DAO类,发现未定义方法返回类型之一。

//Before
@Query("SELECT countryName FROM country_table WHERE countryCode= :code")
    fun getCountryNameForCode(code: String)

//After
@Query("SELECT countryName FROM country_table WHERE countryCode= :code")
    fun getCountryNameForCode(code: String): String

3
gradle->app->Tasks->Build->assemble那是什么?
user25

@ user25 Gradle工具窗口
Ajay Gurappanavar

14

我有一段时间遇到相同的错误,然后开始检查其他软件包,我才知道我在数据库代码中犯了错字错误。因此,“遍历数据库和其他活动类文件,您可能会在这里发现一些错误。”


4
什么样的错误?
Mustaqode

就我而言,我忘记添加@DaoMyDao界面
Ishaan Kumar

13

更改

implementation "android.arch.persistence.room:runtime:1.1.1"
kapt "android.arch.persistence.room:compiler:1.1.1"

 implementation "androidx.room:room-runtime:2.2.5"
 kapt  "androidx.room:room-compiler:2.2.5"

令人惊叹,它有所帮助
user25

8

如果您已升级到classpath'com.android.tools.build:gradle:4.0.0'替换为先前版本

dependencies {
    classpath 'com.android.tools.build:gradle:3.6.3'
}

并更改gradle-wrapper.properties

distributionUrl=https\://services.gradle.org/distributions/gradle-5.6.4-   all.zip`

20
这不是正确的解决方案
Shubham Tater

2
@ShubhamTater在固定gradle4.0.0之前,这是解决方案。这是临时解决方案。一旦gradle4.0.0被修复。我们可以更新gradle 4.0或更高版本
Mujeeb Rahaman T

4
我挂在4.0.1这个例外
ЯрославНестеров

8

对我来说,大量参考错误和XML表达式中的DataBinding错误导致了此错误。

我已经删除了<variable/>layout文件,因为我认为,我不需要它了。我忘记了我在layout文件中引用了变量。

构建项目后,这会产生一个错误,BindingImpl由于该类不存在,因此无法导入该类,并且该错误仅作为与上述KaptExecution错误平行的警告显示。

搜索了一会儿后,我发现此错误并解决了。然后,显示了一系列参考错误,因为我重命名了某些内容,但未在Fragment文件中重命名。在解决了这些错误之后,构建对我来说也没有错误或警告。


1
正确,此错误始终与我们的数据绑定正在使用的XML文件有关。
Shubham Tater

4

我有同样的问题。让我向您介绍有关如何解决该问题以及解决问题的方式的示例,也许您可​​以了解更多。

解决之前

@Entity(tableName = "modules")
data class Module
(
    @PrimaryKey val id: Int,
    val name: String
)

@Entity(tableName = "sessions")
data class Session
(
    @PrimaryKey(autoGenerate = true) var id: Int,
    @ColumnInfo(name = "module_id") val moduleId: Int,
    @ColumnInfo(name = "start_time") val startTime: String,
    @ColumnInfo(name = "end_time") val endTime: String
)

data class ModuleSession
(
    @Embedded val module: Module,
    @Relation(
        parentColumn = "id",
        entityColumn = "module_id"
    )
    val sessions: List<Session>,
    @ColumnInfo(name = "is_updated") val isUpdated: Boolean = false // The problem
)

在DAO中

@Transaction
@Query("SELECT * FROM modules")
abstract suspend fun getModuleSession(): List<ModuleSession>

我得到的错误是

A failure occurred while executing org.jetbrains.kotlin.gradle.internal.KaptExecution

所以我更深入地发现以下消息

The columns returned by the query does not have the fields [isUpdated] in com.gmanix.oncampusprototype.Persistence.ModuleSession even though they are annotated as non-null or primitive. Columns returned by the query: [id,name]
    public abstract java.lang.Object getModuleSession(@org.jetbrains.annotations.NotNull()

我从POJO ModuleSession中删除了IsUpdated字段,并将其添加到会话表中

变更后

@Entity(tableName = "sessions")
data class Session
(
    @PrimaryKey(autoGenerate = true) var id: Int,
    @ColumnInfo(name = "module_id") val moduleId: Int,
    @ColumnInfo(name = "start_time") val startTime: String,
    @ColumnInfo(name = "end_time") val endTime: String,
    @ColumnInfo(name = "is_updated") val isUpdated: Boolean = false
)

data class ModuleSession
(
    @Embedded val module: Module,
    @Relation(
        parentColumn = "id",
        entityColumn = "module_id"
    )
    val sessions: List<Session>
)

另一方面,请交叉检查SELECT语句中是否有任何可疑问题的字段,或者您可以使用@Ignore

但是,如果您仍然不满意,可以发布代码。

希望对您有所帮助


我为我的问题找到了解决方案,我不知道它是否对您有用,但是灵魂在于检查您要绑定的XML文件,绑定是编译时系统,并且对XML文件有效,因此请检查它们是否是任何错误,它将显示这种类型的错误。我更正了XML文件,然后一切正常。
Shubham Tater

2
是的,请。您是如何深入研究的?
Simo Nyathi '20年

2
@LeonardoSibela对此感到抱歉,我的意思是在构建时添加--stacktrace选项,以便我可以获取有关该错误的更多信息。
阿里

您可以从File-> Settings-> Build,Execution,Deployment-> Compiler-> Command-line Options Btw中添加--stacktrace选项,在我的情况下,我缺少依赖项:实现“ androidx.room:room-ktx:$ room_version”
琥珀色

4

就我而言,我使用了room,而我的databasDao方法之一具有未使用的参数,但是不幸的是android studio无法正确警告我


就我而言,我忘记给@PrimaryKey分配给我的班级之一
varotariya vajsi


4

我有同样的问题。就我而言,问题在于数据库。我不得不更改这行代码 @Database(entities = [SearchedLocation::class, FavoriteLocation::class], version = 1)

我在数据库中添加了另一个表,但是忘记在上面的行中添加表。


2

经过一番痛苦之后,我决定尝试,annotationProcessor而不是kapt希望它至少可以显示错误消息或可以帮助我找到源的任何内容。但是幸运的是(或不幸的是,由于浪费了时间),它已成功构建,没有任何错误。它kapt本身主要是一个错误。因此,尝试此解决方案可能会有所帮助。


为此。我将其切换为使用“ annotationProcessor”,并成功构建。然后,我将其切换回“ kapt”,并且能够再次构建。
Mark Lapasa


1

对上面的@Rene Spies的答案大喊大叫,在使用数据绑定时我也遇到了此错误。事实证明,当您将@Bindable注释放在data classKotlin中的主要构造函数中的字段上时,构建引擎不喜欢它。

因此,请不要执行以下操作:

data class MyAwesomePojo(
    @Bindable
    var firstname: String,
    var lastname: String
)

相反,您需要做的是

data class MyCorrectAwesomePojo(
    var lastname: String
):{
    @get:Bindable
    var firstname: String
        set(value){
            field = value
        }
}

奖励:如果您尝试像我这样使用双向绑定来防止设置和获取的无限循环,请记住在将值设置为字段之前检查相同的值。


我为我的问题找到了解决方案,我不知道它是否对您有用,但是灵魂在于检查您要绑定的XML文件,绑定是编译时系统,并且对XML文件有效,因此请检查它们是否是任何错误,它将显示这种类型的错误。我更正了XML文件,然后一切正常。
Shubham Tater

1

有趣的是,由于添加了Retrofit的说明,因此我收到了此错误。请注意不要混淆“房间和装修”的描述。


1

就我而言,这是因为我没有在ViewModel中实现Observable。我添加了一个EditText到约束布局android:text="@={addProductViewModel.inputProductName}"

一旦Observable在ViewModel类中实现,错误就消失了

视图模型

class AddProductViewModel (
    private val repository: ProductRepository,
    private val context: Context
): ViewModel(), Observable {

    @Bindable
    val inputProductName = MutableLiveData<String>()


    fun addProduct() {
        //inputProductName.value
    }

    override fun removeOnPropertyChangedCallback(callback: Observable.OnPropertyChangedCallback?) {
        TODO("Not yet implemented")
    }

    override fun addOnPropertyChangedCallback(callback: Observable.OnPropertyChangedCallback?) {
        TODO("Not yet implemented")
    }
}

使用片段的MVVM数据绑定的完整示例

布局-add_product.xml

<?xml version="1.0" encoding="utf-8"?>
<layout xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    xmlns:android="http://schemas.android.com/apk/res/android" >
    <data class=".AddProductBinding">
        <variable
            name="addProductViewModel"
            type="com.rao.iremind.AddProductViewModel" />
    </data>

    <androidx.constraintlayout.widget.ConstraintLayout
        android:layout_width="match_parent"
        android:layout_height="match_parent">


        <EditText
            android:id="@+id/editTextTextProductName"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:ems="10"
            android:hint="Product name"
            android:inputType="textPersonName"
            android:text="@={addProductViewModel.inputProductName}"
            app:layout_constraintEnd_toEndOf="parent"
            app:layout_constraintStart_toStartOf="parent"
            app:layout_constraintTop_toTopOf="parent" />



    </androidx.constraintlayout.widget.ConstraintLayout>
</layout>

添加产品片段

class AddProductFragment: Fragment() {
    private lateinit var binding: AddProductBinding
    private lateinit var addProductViewModel: AddProductViewModel
    override fun onCreateView(
        inflater: LayoutInflater,
        container: ViewGroup?,
        savedInstanceState: Bundle?
    ): View? {
        binding =  DataBindingUtil.inflate(inflater, R.layout.add_product, container, false)
        val dao = SubscriberDatabase.getInstance(requireActivity().applicationContext).productDAO
        val repository = ProductRepository(dao)
        val factory = AddProductViewModelFactory(repository, requireActivity().applicationContext)
        addProductViewModel = ViewModelProvider(this, factory).get(AddProductViewModel::class.java)
        binding.addProductViewModel = addProductViewModel
        binding.lifecycleOwner = this
        val view = binding.root

        return view
    }
}

AddProductViewModel

class AddProductViewModel (
    private val repository: ProductRepository,
    private val context: Context
): ViewModel(), Observable {

    @Bindable
    val inputProductName = MutableLiveData<String>()


    fun addProduct() {
        //inputProductName.value
    }

    override fun removeOnPropertyChangedCallback(callback: Observable.OnPropertyChangedCallback?) {
        TODO("Not yet implemented")
    }

    override fun addOnPropertyChangedCallback(callback: Observable.OnPropertyChangedCallback?) {
        TODO("Not yet implemented")
    }
}

希望这对R有帮助


1

就我而言:问题已解决

脚步:

  1. 删除viewModel变量-在XML中
<variable
    name="viewModel"
    type="com.xx.AppViewModel" / >
  1. 删除了所有viewModel绑定引用-在XML中
android:text="@{viewModel.simName}"
  1. 删除了对绑定映射的viewModel实例引用-活动中
binding.viewModel = viewModel
  1. 清理项目重新编译。

  2. 添加viewModel变量-在XML和Build项目中

< variable
    name="viewModel"
    type="com.xx.AppViewModel" / >
  1. 将viewModel实例引用添加到绑定映射-在“活动和构建”项目中
binding.viewModel = viewModel
  1. 添加所有viewModel绑定引用-在XML和构建项目中。
    android:text="@{viewModel.simName}"
  1. 现在可以使用了。

-希望它也对您有用。


1

我在Room遇到了同样的问题,并且没有使用viewBinding
我通过在数据库类中使用exportSchema设置为false修复了该问题。

@Database(entities = [ModelClass::class], version = 1, exportSchema = false)
abstract class ModelDatabase: RoomDatabase() {}

请记住:exportScehma可能会根据您的用例而有所不同,通常它保持为false,所以我将其设置为false。


1

就我而言,我已将一个变量UserManager全局更改为NetWorkManager,并且在所有有UserManager类的地方都将其更改为NetworkManager。

因为我使用的是Hilt,所以我不得不再次构建该项目。

我清理了项目,然后Kotlin显示了错误所在。


1

我也遇到了同样的问题,所以我尝试删除它的项目的.idea文件夹和.gradle文件夹,然后我也删除了app文件夹内的build文件夹,然后重新启动android studio IDE,它对我有用


1

对我来说,问题在于在模型上定义了2个主键。

// before    
@field:ColumnInfo(name = "id") @field:PrimaryKey(autoGenerate = true) var id: Long = 0,
@field:ColumnInfo(name = "name") @field:PrimaryKey var name: String,
    
//after
@field:ColumnInfo(name = "id") @field:PrimaryKey(autoGenerate = true) var id: Long = 0,
@field:ColumnInfo(name = "name") @field:NotNull var name: String,

我不得不重建项目并稍微更改Dao类,以触发有关该问题的消息。


1

这种方法对我来说是所有出现问题的Room数据库Coroutines,甚至拼写错误。最后是当尝试通过插入后的列返回带有Flow的单个值时,方法是:Flow<Long>从DAO类。

它应该是一个suspend函数,只有Long类型才能在插入列之后返回。

这些问题有时是模棱两可的,因此请尝试阅读所有的Build Output消息,对我有帮助的消息是: error: Not sure how to handle insert method's return type.


1

什么都没做,我尽了一切,最后发现一个小错误,这是一个大问题。

返回到每个新创建的数据库文件,并逐行仔细检查每个文件的代码。

检查数据库类,并检查是否声明了Dao例如,

abstract val commentDatabaseDao: CommentDatabaseDao

声明为val not var,这是我的情况,最后为此解决。


1

我只是发生在我身上。另一个开发人员未正确完成合并,因此该行在代码中

<<<<<<< HEAD

我没有得到编译错误,而是得到了KaptExecution错误。


1

我有同样的错误。我有两个问题。

  1. 您可能需要添加

    实现'androidx.room:room-ktx:2.2.5'

  2. 我已经删除了一个在activity_xml文件之一中被引用为成员的文件。直到我将其更改为annotationProcessor而不是kapt为止,该错误才给我提供任何线索,然后它指出了该错误,我找到了该文件,并确定我已经引用了一个不再使用并被删除的文件。我从xml中删除了此数据引用,并将其全部清除。然后,我将其放回kapt。



0

就我而言,我已经添加了这一行

 android {
    .
    .
    .

    kapt.includeCompileClasspath = false

 }

0

我刚刚将Android Studio IDE更新到4.1.1版本,并遇到了类似的问题。

我意识到的是……

……在我没上过某些*_Impl课之前(我对科特林一无所知),甚至还没有一些新课*Tests

因此,在“运行世界”解决方案之后,我做出了一个直观而公平的选择:我删除了“手工构建”包中所有那些文件,这些文件在Android Studio更新之前就不存在

你猜怎么着?

有效。没问题,甚至没有一个问题kapt

我并不是说这是最终解决方案。但它可以为您工作。

祝你有个好的一天。


0

是的,我也遇到了这个错误,这也是一个Room相关的问题。

我已经定义了我的TypeConverters,但从未用进行注释Room database@TypeConverters(TypeConverter.class)

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.