ERROR : error.NonExistentClass Kotlin In multi module Dagger project

ERROR : error.NonExistentClass Kotlin In multi module Dagger project

我正在使用 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项目时,遇到了这个错误:

error: error.NonExistentClass

错误出现在

:app:kaptDebugKotlin 

是由于匕首class找不到而执行的,class是在其他项目中定义的。可能的解决方法是什么?抱歉我的英语不好。

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

./gradlew clean

根本原因

基本上,在使用 kapt 时,无法解决这个 。引用 this link 在另一个使用预处理器(OrmaDatabase)的库中解决同样的问题:

Because Kotlin makes its stubs before Java Annotation Processing runs, Kotlin knows just nothing about OrmaDatabase, and the name of the declaration in stubs will be error.NonExistentClass. This breaks the Annotation Processing tool. It's a kind of kapt limitation

如何修复它(解决方法)

只需为 运行 Dagger 编译器使用普通 aptannotationProcessor。我一改:

kapt libs.daggerCompiler

annotationProcessor libs.daggerCompiler

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

我发现你是否在使用

kapt {
    generateStubs = true
}

更改为 false 将显示实际错误,一旦编译问题得到纠正,您可能会在构建 Dagger Graph 时遇到问题,但只需更改回 true,就可以了

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

我遇到了同样的错误,原来我只是注释掉了我在 AppComponent 中使用的 class。不幸的是,kapt 工具没有给我正确的错误信息。如果您在库的编译器中将 kapt 更改为 annotationProcessor 并尝试构建,它也不会成功,但您会收到更详细的错误消息。

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

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

我最近遇到了同样的问题。正如我有时通过 Android Studio (3.4.c6) 提交的那样,我使用 "Optimize imports" 选项删除未使用的导入。出于某种原因,它删除了 Parcelize 注释的导入。

只需将此添加到构建 gradle 文件中即可避免与 NonExistentClass

相关的问题
kapt {
    correctErrorTypes true 
} 

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

升级.gradle版本后出现错误

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

-    androidTestCompile "org.mockito:mockito-android:2.7.21" // remove this
+    androidTestCompile "org.mockito:mockito-android:2.+"    // add this

如果您在 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

在我的例子中,我有来自 support-annotations @Nullable 注释,但为了迁移到 AndroidX.
构建时,由于注解没有正确导入,检测为无效

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

kapt 似乎无法找到 class,或者无法确定要使用哪个 class。例如

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

@Abc
class Xyz { ... }

当我错误地将测试 class 移动到我的主源集中时,我得到了这个错误。将其移回测试源集消除了错误。

当我的注入 class 中出现编译错误时,我收到了这个错误。请确保没有任何编译错误。

我有一个项目用 Dagger 将一些东西注入 Presenters 有那么一瞬间,我有了一种执着 "NonExistentClass.java:3: error: error.NonExistentClass must be INTERFACE"错误

根本原因微不足道:带有未满足依赖项的有效 @Inject 注释文件的恶意副本以某种方式溜进了项目。我们怎样才能找到它? Android Studio 中的项目看起来不错。

  1. 看错误信息,好像是:

    /home/alex/AndroidProvects/TopProject/app/build/tmp/kapt3/stubs/onlineDebug/error/NonExistentClass.java:3: 错误: error.NonExistentClass 必须是接口 public 最终 class NonExistentClass {

  2. 在kapt编译的构建文件中搜索 /home/alex/AndroidProvects/TopProject/app/build/tmp/kapt3/stubs/onlineDebug/app 表示“NonExistentClass”字符串

  3. 您将找到具有确切未满足的 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')

过时的库之后

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() {

对于所有像我一样到达此主题但有类似错误的人。
检查您的注释导入
对我来说,问题是我的 @MicronautTest 注释与另一个测试相同,只是错误的注释。不知何故,intellij 似乎认为导入没问题,但实际上并非如此。

我有
import io.micronaut.test.extensions.junit5.annotation.MicronautTest
还需要 kotest 一个。
import io.micronaut.test.extensions.kotest.annotation.MicronautTest

kapt 错误虽然在技术上是正确的,但没有提供多少信息。 所以只要检查一下进口,如果它们都是正确的。

ERROR : error.NonExistentClass

这意味着提供依赖关系(并且不是依赖关系本身!。

有时注释处理器(在本例中为 Dagger)由于缺少提供者而无法在第一次构建迭代时构建依赖关系图。

例如:您正在将 GlideApp 作为参数传递给您的提供者,而 GlideApp class 尚未生成!因此,请注意您的提供商是否存在 NonExistentClass 错误。