错误:error.NonExistentClass Kotlin 在多模块 Dagger 项目中
Posted
技术标签:
【中文标题】错误:error.NonExistentClass Kotlin 在多模块 Dagger 项目中【英文标题】:ERROR : error.NonExistentClass Kotlin In multi module Dagger project 【发布时间】:2017-12-19 08:40:17 【问题描述】:我正在使用 Dagger 2 和 Kotlin 进行 android 开发。 我的项目也是一个多模块项目。 我的 settings.gradle 文件是这样的:
include :app
include :lib
我也在维护 lib 模块。
在 Dagger 文件中(例如在组件中),我尝试从其他模块中获取项目。例如:
@Component
interface AppComponent
fun getPresenter() : Presenter
Presenter 对象在 lib 模块中定义。我在 linux 环境中工作,我正在使用 Android Studio 3 preview canary 5。代码运行良好,我能够生成 APK。
但我的公司想使用稳定版本的 Android Studio 生成 APK。我正在使用 Android Studio 2.3.3。
在编译Android Project的时候遇到了这个错误:
error: error.NonExistentClass
当出现错误
:app:kaptDebugKotlin
是因为找不到dagger类导致的,该类是在其他项目中定义的。可能的解决方法是什么?对不起我的英语不好。
【问题讨论】:
你能发布你的项目和模块的 gradle 文件吗? 你能不能把./gradlew build --info --stacktrace
的输出也贴出来
【参考方案1】:
只需添加这个来构建 gradle 文件以避免与NonExistentClass
相关的问题
kapt
correctErrorTypes true
https://kotlinlang.org/docs/reference/kapt.html#non-existent-type-correction
【讨论】:
这帮助我找到了真正的问题。在添加此内容之前,该错误具有误导性 这应该是公认的答案,因为它会带您了解真正的问题。 谢谢,你是救生员。当ViewBinding
时,我的问题也出现在 android studio 强制使用 androidx
不应该是correctErrorTypes = true
吗?
在 kt gradle 文件中,如果没有 =,它无法为我构建【参考方案2】:
根本原因
基本上,在使用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
,否则不会生成 dagger 类,因为它们是在 Kotlin 中定义的。
【讨论】:
你也可以运行./gradlew :app:compileDebugJavaWithJavac --stacktrace
来找出错误的根源。【参考方案3】:
我在使用 Dagger 的多模块项目中遇到了非常相似的 NonExistentClass
错误,结果我忘记添加 kotlin 库依赖项。因此,只需将其添加到子模块中即可解决我的问题:
implementation "org.jetbrains.kotlin:kotlin-stdlib-jdk7:$rootProject.kotlinVersion"
【讨论】:
几乎相同 - 在我的情况下,我忘记将kotlin-android
插件添加到模块的 build.gradle。【参考方案4】:
tldr:在 build.gradle 中将 kapt 改为 annotationProcessor,你就会看到真正的问题。
我遇到了同样的错误,结果我只是注释掉了我在 AppComponent 中使用的一个类。不幸的是,kapt 工具没有给我正确的错误信息。如果您在库的编译器中将 kapt 更改为 annotationProcessor,并尝试构建,它也不会成功,但您会收到更详细的错误消息。
【讨论】:
使用 annotationProcessor 向我展示了这个问题。谢谢!【参考方案5】:在我的例子中,我有来自 support-annotations 的 @Nullable
注释 而我为了迁移到 AndroidX
而删除了它。
构建时,由于注解没有正确导入,被检测为无效。
我所做的是检查代码并修复所有导入。
【讨论】:
这实际上是我的问题。谢谢! 将所有导入从org.jetbrains.annotations.Nullable
替换为 androidx.annotation.Nullable
解决了我的问题【参考方案6】:
在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()
【讨论】:
我在@Inject 上得到了未解决的参考,我错过了什么吗? @Kuldeepmourya,也许你应该重建项目。或者检查供应商。【参考方案7】:看来,kapt 有一个错误,项目清理应该会有所帮助。
./gradlew clean
【讨论】:
Plus Invalid Cache and Restart 为我做了。 如youtrack.jetbrains问题所述,我们必须删除./gradle/caches
:youtrack.jetbrains.com/issue/…
这对我来说非常有用!【参考方案8】:
当我错误地将一个测试类移动到我的主源集中时,我得到了这个错误。将其移回测试源集消除了错误。
【讨论】:
【参考方案9】:当我的 Injected 类中出现编译错误时,我收到了这个错误。请确保没有任何编译错误。
【讨论】:
【参考方案10】:我发现你是否正在使用
kapt
generateStubs = true
更改为 false 将显示实际错误,一旦编译问题得到纠正,您可能会在构建 Dagger Graph 时遇到问题,但只需更改回 true,您应该会很好
【讨论】:
【参考方案11】:对于所有像我一样遇到类似错误的人。检查您的注释导入。
对我来说,问题是我的 @MicronautTest
注释与另一个测试相同,只是错误的一个。不知何故,intellij 似乎认为导入很好,但实际上并非如此。
我有import io.micronaut.test.extensions.junit5.annotation.MicronautTest
还需要 kotest 的。import io.micronaut.test.extensions.kotest.annotation.MicronautTest
kapt 错误虽然在技术上是正确的,但信息量不大。 所以只需检查导入,看看它们是否都正确。
【讨论】:
【参考方案12】:我最近遇到了同样的问题。由于我有时通过 Android Studio (3.4.c6) 提交,我使用“优化导入”选项来删除未使用的导入。出于某种原因,它删除了 Parcelize 注释的导入。
【讨论】:
【参考方案13】:升级.gradle版本后出现错误。
将 mockito 的版本从 2.7.21 升级到 2.+ 为我解决了这个问题。
- androidTestCompile "org.mockito:mockito-android:2.7.21" // remove this
+ androidTestCompile "org.mockito:mockito-android:2.+" // add this
【讨论】:
【参考方案14】:似乎 kapt 找不到类,或者无法确定要使用哪个类。例如
import foo.* // class foo.Abc
import bar.* // annotation bar.Abc
@Abc
class Xyz ...
【讨论】:
【参考方案15】:我有一个项目,使用 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 依赖项的确切文件(在我的情况下,它是一个不应该存在的流氓孤儿文件)
【讨论】:
【参考方案16】:我对匕首也有类似的问题。添加以下内容有助于解决它:
// 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')
【讨论】:
【参考方案17】:ERROR : error.NonExistentClass
这意味着提供依赖项(并且不是依赖项本身!)存在问题。
有时注释处理器(在本例中为 Dagger)由于提供者不存在而无法在第一次构建迭代时构建依赖关系图。
例如:您将 GlideApp 作为参数传递给您的提供程序,而 GlideApp 类尚未生成!因此,请注意您的提供商是否有 NonExistentClass
错误。
【讨论】:
【参考方案18】:如果您在 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
【讨论】:
我应该把它放在模块的什么地方,到底是什么? 在模块的gradle.properties
文件中
嗯,我的模块中没有 gradle.properties 文件,只有***文件...知道为什么吗?
我不知道你为什么没有 gradle.properties 文件但是你可以添加它,它只是一个带有 .properties 扩展名的测试文件
*文本文件.properties以上是关于错误:error.NonExistentClass Kotlin 在多模块 Dagger 项目中的主要内容,如果未能解决你的问题,请参考以下文章
远程服务器返回错误: 404错误远程服务器返回错误:500错误 HttpWebResponse远程服务器返回错误:(404500) 错误。
Pig 安装错误:错误 pig.Main:错误 2998:未处理的内部错误