我使用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类找不到,该类在其他项目中定义。可能的解决方法是什么?抱歉我的英语不好。
答案 0 :(得分:15)
基本上,在使用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中定义。
答案 1 :(得分:3)
tldr:在build.gradle中将kapt更改为annotationProcessor,您将看到真正的问题。
我得到了同样的错误,结果发现我刚刚注释掉了我在AppComponent中使用的一个类。不幸的是,kapt工具没有给我正确的错误信息。如果你在库的编译器中将kapt更改为annotationProcessor,并尝试构建,它既不会成功,但是你会收到更详细的错误消息。
答案 2 :(得分:2)
在使用Dagger的多模块项目中,我遇到了一个非常相似的情况,发生了NonExistentClass
错误,结果我忘了添加kotlin库依赖项。因此,只需将其添加到子模块中即可解决我的问题:
implementation "org.jetbrains.kotlin:kotlin-stdlib-jdk7:$rootProject.kotlinVersion"
答案 3 :(得分:1)
我发现你是否正在使用
kapt {
generateStubs = true
}
更改为false将显示实际错误,一旦编译问题得到纠正,您可能会遇到构建Dagger Graph的问题,但只需更改回true,您就应该很好
答案 4 :(得分:1)
只需将其添加到构建gradle文件中,以避免与NonExistentClass相关的问题
kapt {
correctErrorTypes true
}
https://kotlinlang.org/docs/reference/kapt.html#non-existent-type-correction
答案 5 :(得分:1)
在removing过时的图书馆之后
implementation 'androidx.hilt:hilt-lifecycle-viewmodel:1.0.0-alpha03'
kapt 'androidx.hilt:hilt-compiler:1.0.0-alpha03'
我收到此错误:
incompatible types: NonExistentClass cannot be converted to Annotation
看着https://dagger.dev/hilt/view-model.html,我在ViewModel
中改变了:
class MainViewModel @ViewModelInject constructor(
...
) : ViewModel() {
到
@HiltViewModel
class MainViewModel @Inject constructor(
...
) : ViewModel() {
答案 6 :(得分:0)
对于所有像我一样在这个主题上遇到类似错误的人。
检查您的注释导入。
对我来说,问题是我的 @MicronautTest
注释与另一个测试相同,只是错误的。不知何故,intellij 似乎认为导入没问题,但事实并非如此。
我有
import io.micronaut.test.extensions.junit5.annotation.MicronautTest
还需要kotest的。
import io.micronaut.test.extensions.kotest.annotation.MicronautTest
kapt 错误虽然在技术上是正确的,但信息量很低。 因此,只需检查导入以及它们是否全部正确。
答案 7 :(得分:0)
看来,kapt存在一个错误,项目清理应该有所帮助。
./gradlew clean
答案 8 :(得分:0)
我在使用 dagger 时遇到了类似的问题。添加以下内容有助于解决它:
// dagger
implementation dep('com.google.dagger:dagger')
implementation dep('com.google.dagger:dagger-android-support')
implementation dep('com.spotify.dagger.android:dagger')
kapt dep('com.google.dagger:dagger-android-processor')
kapt dep('com.google.dagger:dagger-compiler')
答案 9 :(得分:0)
我有一个Dagger项目,向Presenters中注入了一些东西
一时之间,我变得执着
"NonExistentClass.java:3: error: error.NonExistentClass must be INTERFACE"
错误
根本原因很简单:有效的@Inject批注文件的流氓副本带有不满意的依赖关系,并以某种方式滑入了项目。我们如何找到它? Android Studio中的项目看起来不错。
查看错误消息,看起来像:
/home/alex/AndroidProvects/TopProject/app/build/tmp/kapt3/stubs/onlineDebug/error/NonExistentClass.java:3:错误:error.NonExistentClass必须为INTERFACE 公共最终课程NonExistentClass {
在kapt构建文件中搜索
/home/alex/AndroidProvects/TopProject/app/build/tmp/kapt3/stubs/onlineDebug
/ app表示“ NonExistentClass”字符串
您将找到具有完全不满足的Dagger依赖关系的确切文件(在我的情况下,它是不应该存在的流氓孤儿文件)
答案 10 :(得分:0)
当我的Injected类中出现编译错误时,我收到此错误。请确保没有任何编译错误。
答案 11 :(得分:0)
当我错误地将测试类移入我的主要源集中时,出现了此错误。将其移回测试源集可以消除该错误。
答案 12 :(得分:0)
看来kapt无法找到该类,或者无法确定要使用哪个类。例如
import foo.* // class foo.Abc
import bar.* // annotation bar.Abc
@Abc
class Xyz { ... }
答案 13 :(得分:0)
以我为例,我删除了 support-annotations 中的@Nullable
个注释,以便迁移到 AndroidX
。< br />
构建时,由于注释未正确导入,因此被检测为无效。
我所做的是检查代码并修复所有导入。
答案 14 :(得分:0)
如果您在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
答案 15 :(得分: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
答案 16 :(得分:0)
我最近有同样的问题。有时我会通过Android Studio(3.4.c6)进行提交,因此我使用“优化导入”选项来删除未使用的导入。由于某些原因,它删除了Parcelize批注的导入。