ОШИБКА: 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 

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

20 ответов

Решение

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

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

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

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

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

kapt libs.daggerCompiler

в

annotationProcessor libs.daggerCompiler

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

Просто добавьте это для создания файла gradle, чтобы избежать проблем, связанных с NonExistentClass

kapt {
 correctErrorTypes true 
} 

https://kotlinlang.org/docs/reference/kapt.html

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

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

tldr: измените kapt на annotationProcessor в build.gradle, и вы увидите реальную проблему.

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

После удаления устаревшей библиотеки

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

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

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

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

    kapt {
    generateStubs = true
}

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

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

./gradlew clean

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

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

      ERROR : error.NonExistentClass

Это означает, что существует проблема с предоставлением зависимостейне с самой зависимостью!).

Иногда процессор аннотаций (в данном случае Dagger) не может построить граф зависимостей на первой итерации сборки из-за отсутствия провайдера.

Например: вы передаете GlideApp в качестве параметра в вашем провайдере, а класс GlideApp еще не сгенерирован! Итак, следите за своими поставщиками NonExistentClass ошибки.

Это проблема синхронизации компиляции.

Делать

./gradlew чистая сборка

или

сделать недействительным кеш и перезапустить

Для всех, кто, как и я, пришел по этой теме с аналогичной ошибкой.
Проверьте импорт аннотаций .
Для меня проблема заключалась в том, что у меня был @MicronautTestаннотация такая же, как и у другого теста, только не та. Почему-то intellij, кажется, думает, что импорт в порядке, хотя на самом деле это не так.

я имел
import io.micronaut.test.extensions.junit5.annotation.MicronautTest
пока нужен был котест.
import io.micronaut.test.extensions.kotest.annotation.MicronautTest

Ошибка kapt, хотя технически верна, но малоинформативна. Так что просто проверьте импорт и все ли они верны.

Если у кого-то еще есть проблемы. Проверьте эту ссылку

           androidComponents {
    onVariants(selector().all(), { variant ->
        afterEvaluate {
            // This is a workaround for https://issuetracker.google.com/301244513 which depends on internal
            // implementations of the android gradle plugin and the ksp gradle plugin which might change in the future
            // in an unpredictable way.
            project.tasks.getByName("ksp" + variant.name.capitalize() + "Kotlin") {
                def buildConfigTask = (com.android.build.gradle.tasks.GenerateBuildConfig) project.tasks.getByName("generate" + variant.name.capitalize() + "BuildConfig")

                ((org.jetbrains.kotlin.gradle.tasks.AbstractKotlinCompileTool) it).setSource(
                        buildConfigTask.sourceOutputDir
                )
            }
        }
    })
}

Добавьте это в конец файла build.gradle уровня приложения.

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

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

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

У меня был проект с 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: error.NonExistentClass должен быть общедоступным конечным классом INTERFACE NonExistentClass {

  2. Искать в скомпилированных файлах сборки kapt в/home/alex/AndroidProvects/TopProject/app/build/tmp/kapt3/stubs/onlineDebug/ app для строки "NonExistentClass"

  3. Вы найдете точный файл с точной неудовлетворенной зависимостью Dagger (в моем случае это был мошеннический файл-сирота в том месте, где он не должен существовать)

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

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

@Abc
class Xyz { ... }

У меня были похожие проблемы с кинжалом. Добавление следующего помогло решить эту проблему:

      // 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')

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

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