我正在使用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类找不到,该类在其他项目中定义。可能的解决方法是什么?对不起,我的英语不好。
基本上,使用kapt
时,没有太多办法可以解决这个问题。引用this link来解决另一个使用预处理器的库(OrmaDatabase)中的相同问题:
因为Kotlin在Java Annotation Processing运行之前创建它的存根,所以Kotlin对OrmaDatabase一无所知,并且存根中声明的名称将是error.NonExistentClass。这打破了注释处理工具。这是一种kapt限制
只需使用普通的apt
或annotationProcessor
来运行Dagger编译器。我一改变了:
kapt libs.daggerCompiler
至
annotationProcessor libs.daggerCompiler
在我的模块级别build.gradle
文件中,我能够得到错误。修复错误之后,你必须将该行恢复为kapt
,否则因为它们是在Kotlin中定义的,所以不会生成匕首类。
看来kapt无法找到类,或者无法确定使用哪个类。例如
import foo.* // class foo.Abc
import bar.* // annotation bar.Abc
@Abc
class Xyz { ... }
当我错误地将测试类移动到我的主要源集中时,我收到此错误。将其移回测试源集可以消除错误。
如果您在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
tldr:在build.gradle中将kapt更改为annotationProcessor,您将看到真正的问题。
我得到了同样的错误,事实证明我刚刚注释掉了我在AppComponent中使用的一个类。不幸的是,kapt工具没有给我正确的错误信息。如果你在库的编译器中将kapt更改为annotationProcessor,并尝试构建,它既不会成功,但会得到更详细的错误消息。
我在使用Dagger的多模块项目中遇到NonExistentClass
错误的情况非常相似,结果我忘了添加kotlin库依赖项。所以,只需在子模块中添加它就可以解决我的问题:
implementation "org.jetbrains.kotlin:kotlin-stdlib-jdk7:$rootProject.kotlinVersion"
只需添加此内容即可构建gradle文件,以避免与NonExistentClass相关的问题
kapt {
correctErrorTypes true
}
https://kotlinlang.org/docs/reference/kapt.html#non-existent-type-correction
我发现你是否正在使用
kapt {
generateStubs = true
}
更改为false将显示实际错误,一旦编译问题得到纠正,您可能会遇到构建Dagger Graph的问题,但只需更改回true,您应该是好的
在我的情况下,我从支持注释中获得了@Nullable
注释,而我为了迁移到AndroidX
而删除它。
构建时,由于注释未正确导入,因此检测为无效。
我所做的是检查代码并修复所有导入。
看来,kapt存在一个错误,项目清理应该有所帮助。
./gradlew clean
我最近遇到了同样的问题。由于我有时通过Android Studio(3.4.c6)提交,我使用“优化导入”选项来删除未使用的导入。出于某种原因,它删除了Parcelize注释的导入。
升级.gradle版本后出现错误。
将mockito的版本从2.7.21升级到2. +为我解决了这个问题。
- androidTestCompile "org.mockito:mockito-android:2.7.21" // remove this
+ androidTestCompile "org.mockito:mockito-android:2.+" // add this