错误:error.NonExistentClass Kotlin在多模块Dagger项目中

时间:2017-07-14 09:41:34

标签: android kotlin dagger-2 multi-module

我使用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类找不到,该类在其他项目中定义。可能的解决方法是什么?抱歉我的英语不好。

17 个答案:

答案 0 :(得分:15)

根本原因

基本上,在使用kapt 时,修复此所做的工作并不多。引用this link来解决使用预处理器(OrmaDatabase)的另一个库中的相同问题:

  

因为Kotlin在Java Annotation Processing运行之前创建了它的存根,   Kotlin对OrmaDatabase及其名称一无所知   存根中的声明将是error.NonExistentClass。这打破了   注释处理工具。这是一种kapt限制

如何修复它(解决方法)

只需使用普通aptannotationProcessor来运行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中的项目看起来不错。

  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依赖关系的确切文件(在我的情况下,它是不应该存在的流氓​​孤儿文件)

答案 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批注的导入。