【问题标题】:ERROR : error.NonExistentClass Kotlin In multi module Dagger project错误:error.NonExistentClass Kotlin 在多模块 Dagger 项目中
【发布时间】: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的输出也贴出来

标签: android kotlin dagger-2 multi-module


【解决方案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 中的项目看起来不错。

                1. 看看报错信息,是这样的:

                  /home/alex/AndroidProvects/TopProject/app/build/tmp/kapt3/stubs/onlineDebug/error/NonExistentClass.java:3: 错误:error.NonExistentClass 必须是 INTERFACE 公共最终类 NonExistentClass {

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

                3. 您将找到具有确切不满足的 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
                      猜你喜欢
                      • 1970-01-01
                      • 2019-08-07
                      • 1970-01-01
                      • 2019-05-05
                      • 1970-01-01
                      • 1970-01-01
                      • 1970-01-01
                      • 1970-01-01
                      • 1970-01-01
                      相关资源
                      最近更新 更多