错误:error.NonExistentClass Kotlin在多模块Dagger项目中

问题描述 投票:19回答:11

我正在使用Dagger 2和Kotlin进行Android开发。我的项目也是一个多模块项目。我的settings.gradle文件是这样的:

include :app
include :lib

我也在维护lib模块。

在Dagger文件中(例如在组件中),我尝试从其他模块中获取项目。例如:

@Component
interface AppComponent{
    fun getPresenter() : Presenter
}

Presenter对象在lib模块中定义。我在linux环境中工作,我正在使用Android Studio 3预览金丝雀5.代码运行良好,我能够生成APK。

但是我的公司希望使用稳定版的Android Studio生成APK。我正在使用Android Studio 2.3.3。

在编译Android项目时,我遇到了这个错误:

error: error.NonExistentClass

出现错误

:app:kaptDebugKotlin 

执行并由dagger类找不到,该类在其他项目中定义。可能的解决方法是什么?对不起,我的英语不好。

android kotlin dagger-2 multi-module
11个回答
19
投票

根本原因

基本上,使用kapt时,没有太多办法可以解决这个问题。引用this link来解决另一个使用预处理器的库(OrmaDatabase)中的相同问题:

因为Kotlin在Java Annotation Processing运行之前创建它的存根,所以Kotlin对OrmaDatabase一无所知,并且存根中声明的名称将是error.NonExistentClass。这打破了注释处理工具。这是一种kapt限制

如何解决(解决方法)

只需使用普通的aptannotationProcessor来运行Dagger编译器。我一改变了:

kapt libs.daggerCompiler

annotationProcessor libs.daggerCompiler

在我的模块级别build.gradle文件中,我能够得到错误。修复错误之后,你必须将该行恢复为kapt,否则因为它们是在Kotlin中定义的,所以不会生成匕首类。


0
投票

看来kapt无法找到类,或者无法确定使用哪个类。例如

import foo.*  // class foo.Abc
import bar.*  // annotation bar.Abc

@Abc
class Xyz { ... }

0
投票

当我错误地将测试类移动到我的主要源集中时,我收到此错误。将其移回测试源集可以消除错误。


-1
投票

如果您在Android X迁移后遇到此问题并开始失去理智,那么您可以尝试一件事。

我的情况:

我们的项目中有很少的模块,我们可以调用其中一个myModuleProject。迁移到Android X后,如果我从android studio运行它,它正在编译并运行正常,但是当代码移动到云并且CI开始构建时,它失败了':myModuleProject:kaptDebugKotlin'并且有很长的错误列表,例如

e: /home/circleci/code/myModuleProject/build/tmp/kapt3/stubs/debug/package_name_here/reporter/bindingadapter/SomeBindingAdapterKt.java:14: error: incompatible types: NonExistentClass cannot be converted to Annotation
@error.NonExistentClass()

经过两天的噩梦,我发现不仅根项目gradle.properties而且模块项目应包括以下内容!

android.databinding.enableV2=true
android.useAndroidX=true
android.enableJetifier=true

3
投票

tldr:在build.gradle中将kapt更改为annotationProcessor,您将看到真正的问题。

我得到了同样的错误,事实证明我刚刚注释掉了我在AppComponent中使用的一个类。不幸的是,kapt工具没有给我正确的错误信息。如果你在库的编译器中将kapt更改为annotationProcessor,并尝试构建,它既不会成功,但会得到更详细的错误消息。


3
投票

我在使用Dagger的多模块项目中遇到NonExistentClass错误的情况非常相似,结果我忘了添加kotlin库依赖项。所以,只需在子模块中添加它就可以解决我的问题:

implementation "org.jetbrains.kotlin:kotlin-stdlib-jdk7:$rootProject.kotlinVersion"

2
投票

只需添加此内容即可构建gradle文件,以避免与NonExistentClass相关的问题

kapt {
 correctErrorTypes true 
} 

https://kotlinlang.org/docs/reference/kapt.html#non-existent-type-correction


1
投票

我发现你是否正在使用

    kapt {
    generateStubs = true
}

更改为false将显示实际错误,一旦编译问题得到纠正,您可能会遇到构建Dagger Graph的问题,但只需更改回true,您应该是好的


1
投票

在我的情况下,我从支持注释中获得了@Nullable注释,而我为了迁移到AndroidX而删除它。 构建时,由于注释未正确导入,因此检测为无效。

我所做的是检查代码并修复所有导入。


0
投票

看来,kapt存在一个错误,项目清理应该有所帮助。

./gradlew clean

0
投票

我最近遇到了同样的问题。由于我有时通过Android Studio(3.4.c6)提交,我使用“优化导入”选项来删除未使用的导入。出于某种原因,它删除了Parcelize注释的导入。


0
投票

升级.gradle版本后出现错误。

将mockito的版本从2.7.21升级到2. +为我解决了这个问题。

-    androidTestCompile "org.mockito:mockito-android:2.7.21" // remove this
+    androidTestCompile "org.mockito:mockito-android:2.+"    // add this
© www.soinside.com 2019 - 2024. All rights reserved.