ERROR: error.NonExistentClass Kotlin В проекте с несколькими модулями Dagger

Я использую Dagger 2 и Kotlin для разработки под Android. Мой проект также является многомодульным проектом. Мой файл settings.gradle выглядит так:

include :app
include :lib

Я также поддерживаю модуль lib.

В Dagger Files (например, в компоненте) я пытаюсь получить предмет из другого модуля. Например:

@Component
interface AppComponent{
    fun getPresenter() : Presenter
}

Объект Presenter определен в модуле lib. Я работал в среде Linux, и я использую Android Studio 3 Preview Canary 5. Код работает хорошо, и я могу генерировать APK.

Но моя компания хотела создать APK, используя стабильную версию Android Studio. Я использую Android Studio 2.3.3.

При компиляции Android Project я столкнулся с этой ошибкой:

error: error.NonExistentClass

Ошибка появляется, когда

:app:kaptDebugKotlin 

выполняется и вызван тем, что класс кинжала не найден, класс определен в другом проекте. Какой может быть возможный обходной путь для этого? Извините за мой плохой английский.

Ответ 1

Корневая причина

В принципе, не так много можно сделать, чтобы исправить этот при использовании kapt. Чтобы процитировать эту ссылку, которая решает ту же проблему в другой библиотеке, которая использует предварительные процессоры (OrmaDatabase):

Поскольку Kotlin создает свои заглушки до запуска обработки аннотаций Java, Kotlin ничего не знает об OrmaDatabase, а имя объявление в заглушках будет иметь ошибку. NonExistentClass. Это нарушает Инструмент обработки аннотации. Это своего рода ограничение капитана

Как это исправить (обходной путь)

Просто используйте plain apt или annotationProcessor для запуска компилятора Dagger. Как только я изменил:

kapt libs.daggerCompiler

to

annotationProcessor libs.daggerCompiler

в моем уровне модуля build.gradle, я смог получить ошибки. После исправления ошибок вы должны вернуть строку до kapt, потому что иначе классы кинжалов не будут сгенерированы, поскольку они определены в Kotlin.

Ответ 2

У меня была очень похожая ситуация с ошибкой NonExistentClass в многомодульном проекте с использованием Dagger, и оказалось, что я забыл добавить зависимость от библиотеки kotlin. Итак, просто добавив его в подмодуль, я решил мою проблему:

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

Ответ 3

TL;DR: измените kapt на annotationProcessor в build.gradle, и вы увидите настоящую проблему.

Я получил ту же ошибку, и оказалось, что я просто прокомментировал класс, который я использовал в своем AppComponent. К сожалению, инструмент kapt не дал мне правильное сообщение об ошибке. Если вы измените kapt на annotationProcessor в своем компиляторе библиотеки и попытаетесь построить, это не удастся, но вы получите более подробное сообщение об ошибке.

Ответ 5

Я нашел, если вы используете

    kapt {
    generateStubs = true
}

изменив значение на false, представит фактическую ошибку, вероятно, у вас возникнут проблемы с построением графика кинжала после исправления ошибок компиляции, но просто измените значение на true, и вы должны быть хорошими

Ответ 6

В моем случае у меня была аннотация @Nullable из support-annotations, в то время как я удалил ее, чтобы перейти на AndroidX.
При создании, поскольку аннотация была импортирована неправильно, она была обнаружена как недействительная.

Я проверил код и исправил весь импорт.

Ответ 7

Я получил эту ошибку, когда по ошибке переместил тестовый класс в свой основной источник. Перемещение его обратно на тестовый источник избавило от ошибки.

Ответ 8

Кажется, есть ошибка с kapt, очистка проекта должна помочь.

./gradlew clean

Ответ 9

У меня недавно была такая же проблема. Поскольку я иногда фиксирую в Android Studio (3.4.c6), я использую опцию "Оптимизировать импорт", чтобы удалить неиспользуемый импорт. По некоторым причинам он удалил импорт для аннотации Parcelize.

Ответ 10

После обновления версии .gradle появились ошибки.

Обновил версию для mockito с 2.7.21 до 2. + исправил проблему для меня.

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

Ответ 11

Кажется, Капт не может найти класс или не может определить, какой класс использовать. например

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

@Abc
class Xyz { ... }

Ответ 12

Я получил эту ошибку, когда произошла ошибка компиляции в моем классе Injected. Пожалуйста, убедитесь, что нет ошибок компиляции.

Ответ 13

Если вы столкнетесь с этой проблемой после миграции 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