错误: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 限制

如何修复它(解决方法)

只需使用普通的aptannotationProcessor 来运行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:未处理的内部错误

Informix 错误:发生了语法错误。错误代码:-201

我收到一个错误:“MetaMask - RPC 错误:错误:错误:[ethjs-rpc] rpc 错误与有效负载”

错误精灵错误跟踪器错误

网页打开显示错误500是啥意思