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

Posted

技术标签:

【中文标题】执行 org.jetbrains.kotlin.gradle.internal.KaptExecution 时发生故障【英文标题】:A failure occurred while executing org.jetbrains.kotlin.gradle.internal.KaptExecution 【发布时间】:2020-09-19 17:09:44 【问题描述】:

突然间我开始收到这个错误,我不明白为什么如果有人让我知道这个错误在哪里,就会有足够的帮助。由于 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文件中显示您的代码。 请同时显示 DataBinderMapperImpl.java 代码。 你更新到 Android Studio 4 了吗?同样的铅 我更新到 Android Studio 4 并且在使用 Room 时遇到了同样的错误,我可以通过更改我的一个查询来临时修复它。我最初有这个查询:“SELECT case_name FROM SavedCases”,然后将其更改为“SELECT * FROM SavedCases”,错误消息消失了。出于某种原因,当我尝试仅查询特定列时,我只会收到此错误。这不是解决问题的理想方法,我希望有人有更好的解决方法。 我遇到了类似的错误,并找到了适合我的解决方案。你可能做过类似的事情。 ***.com/questions/63133657/… 【参考方案1】:

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

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

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

【讨论】:

如果你有一个编译时 Room (DB) 错误,它会这样显示 - 这意味着你的一个或一些查询是错误的 从赞成票来看,这里的 UI 决定不是一个好的选择 这里只有有用的答案,因为问题可能会有所不同! 非常感谢,伙计。我遇到了这个问题,因为我没有在我的 Dao 抽象类中添加 @Dao 注释。 @NaimulKabir 谢谢。我太想念那个该死的道了。浪费了将近2个小时【参考方案2】:

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

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

    在 Android Studio 中,进入 Analyze 菜单并点击 Inspect Code;检查整个项目,点击确定,等待检查完成。

    现在您将看到一个标签,其中将指出所有错误、警告等,您现在可以解决真正的问题。

【讨论】:

是的,它显示的正是错误。 (我在 XML 中犯了一些错误) 我不明白为什么Android Studio在构建失败时不直接显示错误,这没有任何意义。谢谢你,帮了我很多忙 伟大的兄弟。你节省了我的时间 太棒了!完全节省一天 这个问题的最佳答案是这个。这个问题没有一个答案,很多事情都可能发生,所以检查代码是迄今为止最好的解决方案。【参考方案3】:

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

./gradlew assembleDebug --stacktrace

【讨论】:

这对我有用。/gradlew clean assembleDebug --stacktrace --stacktrace 添加到我的 Gradle 命令中就可以了。谢谢,@Etienne。【参考方案4】:

改变

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

到 (2021 年 9 月 4 日更新)

 implementation "androidx.room:room-runtime:2.3.0"
 annotationProcessor "androidx.room:room-compiler:2.3.0"

【讨论】:

太棒了,有帮助 非常感谢兄弟。这对我有帮助。 我正在使用相同的版本,并且随着新的更新它不再工作了。 在更新到 AS v4.1.1 和 gradle 6.5 后,在一个旧项目上遇到了这个问题(我相信那是 gradle 版本)。按照这个答案并将房间部门从 1.0.0 更新到 2.3.0 对我有用。 @ElliotSchrock 你能用链接更新答案吗【参考方案5】:

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

gradle->app->Tasks->Build->assemble

在此之后,我得到了“注释处理时出错”的确切错误。 我检查了我最近调整的 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

【讨论】:

gradle->app->Tasks->Build->assemble 那是什么? @user25 Gradle 工具窗口 Assemble 将构建您的工件,换句话说,组合项目的输出但不构建。构建 = 组装 + 检查。 我还是不明白……【参考方案6】:

我有一段时间遇到同样的错误,然后我开始检查其他包,我知道我在数据库代码中犯了一个拼写错误。所以, “浏览你的数据库和其他活动类文件,你可能会在那里发现一些错误。”

【讨论】:

什么样的错误? 在我的情况下,我忘记在 MyDao 界面中添加@Dao 在我的例子中,我有一个从 Long 到 Date 的 @TypeConverter,但我消除了从 Date 到 Long 的那个【参考方案7】:

我在将我的 Android Studio 升级到 Arctic Fox(2020.3.1) 后开始得到这个。

我通过将我的 JDK 版本从 1.8 更新到 Embedded JDK 解决了这个问题。

要更改 JDK:

在 Android Studio 中打开您的项目并选择 File > Settings... > Build, Execution, Deployment > Build Tools > Gradle

开启 Mac:Android Studio > Preferences... > Build, Execution, Deployment > Build Tools > Gradle。

在 Gradle JDK 下,选择 Embedded JDK 选项。

如上所述here

【讨论】:

【参考方案8】:

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

【讨论】:

感谢这个。我将其切换为使用“annotationProcessor”并成功构建。然后我将它切换回“kapt”,它能够再次构建。 annotationProcessor,错误很明显。谢谢【参考方案9】:

对我来说,一堆引用错误和带有DataBinding 的 XML 表达式中的错误导致了这个错误。

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

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

找了一阵子,发现这个错误,解决了。然后,显示了一堆参考错误,因为我重命名了一些东西,但它没有在 Fragment 文件中重命名它。在也解决了这些错误之后,构建完成后没有错误或警告。

【讨论】:

是的,这个错误总是与我们的数据绑定正在使用的 XML 文件有关。【参考方案10】:

尝试使用

构建您的项目
kapt.use.worker.api=false 

在您的 gradle.properties 设置文件中

参考:https://youtrack.jetbrains.com/issue/KT-40750

【讨论】:

所有设置和注释都正确,即房间设置和注释仍然面临这个问题 kaptExecution failure。这个解决方案救了我!【参考方案11】:

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

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

【讨论】:

【参考方案12】:

对我来说同样的问题。就我而言,原因是我在我的一个 dagger 模块中忘记了 @Module 注释。

要找到此类 AS 警报的真正问题,有必要深入:标题中的消息只是最后一个,显示错误的 1 个或多个原因,选择左侧的根元素,显示你确切的问题,检查我下面的打印屏幕:

【讨论】:

谢谢!很有帮助。【参考方案13】:

好的,如果您使用的是 Android Studio 4.1.2,也会出现此问题。

所以,你要做的是:

下载jdk 11(搜索下载)

在Android Studio中,进入File -> Project Structure -> Jdk Location -> 改成你刚才的Jdk的路径已下载。

【讨论】:

【参考方案14】:

如果您已升级到类路径 '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`

【讨论】:

这不是正确的解决方案 @ShubhamTater 这是解决 gradle4.0.0 之前的问题。这是治标不治本。一旦 gradle4.0.0 被修复。我们可以更新 gradle 4.0 或更高版本 我在 4.0.1 上发现了这个异常【参考方案15】:

我遇到了同样的问题。让我通过示例向您介绍我如何解决问题以及解决问题的方式,也许您可​​以了解更大的情况。

解决之前

@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 文件,然后一切正常。 请。你是如何深入挖掘的? @LeonardoSibela 对此感到抱歉,我的意思是在构建时添加 --stacktrace 选项,以便我可以获得有关错误的更多信息。 您可以从 File->Settings->Build,Execution,Deployment->Compiler->Command-line Options 添加 --stacktrace 选项顺便说一句,在我的情况下,我缺少一个依赖项: implementation "androidx .room:room-ktx:$room_version" 请注意,错误信息不会出现在堆栈跟踪中。相反,当您添加--stacktrace 标志时,错误信息会显示在FAILURE: Build completed with N failures. 的正上方。我花了一秒钟才意识到房间消息是那里【参考方案16】:

就我而言,我忘记在实体类中添加@PrimaryKey。

【讨论】:

领域呢,我不知道为什么在更新领域依赖项后我收到错误 任务':app:kaptJambodevDebugKotlin' 执行失败。 像这样,任何解决方案一样的吗?【参考方案17】:

在我的情况下,当我从 jcenter() 移动到 mavenCentral() 时出现此错误,我的依赖项之一仅在 jcenter() 上可用,而在 mavenCentral() 上不可用。 所以我在 github 上向所有者提交了同样的问题,并将等待删除 jcenter() 直到它被移动。

【讨论】:

【参考方案18】:

在我的情况下,我使用了房间,并且我的一个 databasDao 方法有一个未使用的参数,不幸的是 android studio 没有正确警告我

【讨论】:

在我的情况下,我忘记将@PrimaryKey 给我的班级之一【参考方案19】:

如果您安装了新的 kotlin 插件 (1.4.20-release-Studio4.1-1) 并拥有 dagger (kapt 'com.google.dagger:dagger-compiler:2.30'),也会出现此问题。在这种情况下,一种解决方案可能是将已弃用的 plugin: 'kotlin-android-extensions' 替换为视图绑定 (https://developer.android.com/topic/libraries/view-binding)

【讨论】:

【参考方案20】:

点击终端上的 --stacktrace 可以查看详细的错误信息。你可以在这里找到它:

对我来说,问题在于我有一台配备新 M1 芯片的 MacBook Pro。为了解决这个问题,我需要在房间编译器之前添加kapt "org.xerial:sqlite-jdbc:3.34.0"。见more here。

【讨论】:

谢谢,它对我有用。但现在获取默认启动器类不存在。【参考方案21】:

就我而言,我使用的是 Coroutines,但我忘记为 Room 添加 Kotlin Extensions 和 Coroutines 支持

def room_version = "2.2.6" 实现“androidx.room:room-ktx:$room_version”

【讨论】:

【参考方案22】:

对@Rene Spies 的上述回答大喊大叫,我在处理数据绑定时也遇到了这个错误。事实证明,当您将 @Bindable 注释放在 Kotlin 中 data class 的主构造函数中的字段上时,构建引擎不喜欢它。

所以永远不要这样做,

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 文件,然后一切正常。【参考方案23】:

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

在我的 ViewModel 类中实现 Observable 后,错误就消失了

视图模型

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_
        android:layout_>


        <EditText
            android:id="@+id/editTextTextProductName"
            android:layout_
            android:layout_
            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
    

添加产品视图模型

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")
    

希望这会有所帮助 回复

【讨论】:

这对我有用。文档中从未提及它。那么,不再需要 set() 和 notifyPropertyChanged() 方法了吗??【参考方案24】:

就我而言:问题已解决

步骤:

    删除 viewModel 变量 - 在 XML 中
<variable
    name="viewModel"
    type="com.xx.AppViewModel" / >
    删除了所有 viewModel 绑定引用 - 在 XML 中
android:text="@viewModel.simName"
    删除了对绑定映射的 viewModel 实例引用 - 在活动中
binding.viewModel = viewModel

    清理项目重新编译。

    添加 viewModel 变量 - 在 XML & 构建项目中。

< variable
    name="viewModel"
    type="com.xx.AppViewModel" / >
    将 viewModel 实例引用添加到绑定映射 - 在 Activity & Build 项目中
binding.viewModel = viewModel
    添加所有 viewModel 绑定引用 - 在 XML & Build 项目中。
    android:text="@viewModel.simName"
    现在可以使用了。

-- 我希望它也对你有用。

【讨论】:

【参考方案25】:

Room 也有同样的问题,我没有使用 viewBinding。 我在我的数据库类中使用 exportSchema 将其修复为 false。

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

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

【讨论】:

【参考方案26】:

在我的例子中,我已经将一个全局变量 UserManager 更改为 NetWorkManager,并且在任何有 UserManager 类的地方都变成了 NetworkManager。

因为我使用的是 Hilt,所以我不得不重新构建项目。

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

【讨论】:

【参考方案27】:

对我来说,问题在于模型上定义了 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 类以触发有关该问题的消息。

【讨论】:

【参考方案28】:

这件事发生在我身上。另一个开发人员没有正确完成合并,所以这一行在代码中

<<<<<<< HEAD

我得到的是 KaptExecution 错误,而不是编译错误。

【讨论】:

【参考方案29】:

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

    您可能需要添加

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

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

【讨论】:

【参考方案30】:

有趣的是,我收到了这个错误,因为我添加了改造的描述。注意不要混淆 Room 和 Retrofit 的描述。

【讨论】:

以上是关于执行 org.jetbrains.kotlin.gradle.internal.KaptExecution 时发生故障的主要内容,如果未能解决你的问题,请参考以下文章

jvm的解释执行与编译执行

Jmeter--多个线程组顺序执行和并行执行

小记---------手动执行脚本正常执行,使用crontab定时执行时 不执行

同步执行与异步执行

js函数执行顺序,怎麼让一个函数执行完再执行下面的程序

java中定时执行任务,为啥方法没有执行完就不执行了?