FEHLER: error.NonExistentClass Kotlin In Multimodul-Dagger-Projekt

Lesezeit: 4 Minuten

Benutzer-Avatar
Sebastianus Kurniawan

Ich verwende Dagger 2 und Kotlin für die Android-Entwicklung. Mein Projekt ist auch ein Multi-Modul-Projekt. Meine settings.gradle-Datei sieht so aus:

include :app
include :lib

Ich pflege auch das lib-Modul.

In den Dolchdateien (zum Beispiel in der Komponente) versuche ich, das Element aus einem anderen Modul zu erhalten. Zum Beispiel:

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

Das Presenter-Objekt ist im lib-Modul definiert. Ich habe in einer Linux-Umgebung gearbeitet und verwende Android Studio 3 Preview Canary 5. Der Code funktioniert gut und ich kann APK generieren.

Aber mein Unternehmen wollte das APK mit der stabilen Version von Android Studio generieren. Ich verwende Android Studio 2.3.3.

Beim Kompilieren des Android-Projekts ist dieser Fehler aufgetreten:

error: error.NonExistentClass

Der Fehler tritt auf, wenn

:app:kaptDebugKotlin 

ausgeführt wird und dadurch verursacht wird, dass die Dagger-Klasse nicht gefunden werden kann, ist die Klasse in dem anderen Projekt definiert. Was kann die mögliche Problemumgehung dafür sein? Entschuldigung für mein schlechtes Englisch.

  • Können Sie die Gradle-Dateien Ihres Projekts und Moduls posten?

    – jayeshsolanki93

    14. Juli 2017 um 9:53 Uhr

  • kannst du die Ausgabe auch aus posten ./gradlew build --info --stacktrace

    – günhter

    14. Juli 2017 um 9:54 Uhr

Benutzer-Avatar
seyfullah.bilgin

Fügen Sie dies einfach hinzu, um die Gradle-Datei zu erstellen, um die damit verbundenen Probleme zu vermeiden NonExistentClass

kapt {
    correctErrorTypes true 
} 

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

  • Dies hat mir geholfen, ein echtes Problem zu finden. Vor dem Hinzufügen war der Fehler irreführend

    – Fartab

    23. Oktober 2019 um 18:15 Uhr

  • Dies sollte die akzeptierte Antwort sein, da Sie zum eigentlichen Problem gelangen.

    – Khurram Shahzad

    10. Januar 2020 um 18:48 Uhr

  • Danke, du bist ein Lebensretter. meine probleme traten auch auf, wenn das android studio gezwungen war, androidx zu verwenden ViewBinding

    – mochadwi

    26. Februar 2020 um 11:03 Uhr

  • Sollte es nicht sein correctErrorTypes = true ?

    – EndermanAPM

    5. August 2021 um 13:49 Uhr

  • Bei einer kt-Gradle-Datei konnte sie ohne = nicht für mich erstellt werden

    – EndermanAPM

    10. August 2021 um 10:57 Uhr

Benutzer-Avatar
Iman Akbari

Die Grundursache

Im Grunde kann man nicht viel dagegen tun beim Benutzen kapt. Zitieren dieser Link die das gleiche Problem in einer anderen Bibliothek angeht, die Präprozessoren verwendet (OrmaDatabase):

Da Kotlin seine Stubs erstellt, bevor Java Annotation Processing ausgeführt wird, weiß Kotlin nichts über OrmaDatabase, und der Name der Deklaration in Stubs lautet error.NonExistentClass. Dadurch wird das Anmerkungsverarbeitungswerkzeug beschädigt. Es ist eine Art Kapt-Beschränkung

So beheben Sie das Problem (der Workaround)

Einfach normal verwenden apt oder annotationProcessor zum Ausführen des Dagger-Compilers. Sobald ich gewechselt habe:

kapt libs.daggerCompiler

zu

annotationProcessor libs.daggerCompiler

in meiner Modulstufe build.gradle Datei konnte ich die Fehler bekommen. Nachdem Sie die Fehler behoben haben, müssen Sie die Leitung wieder auf zurücksetzen kapt da sonst keine Dolchklassen generiert würden, da sie in Kotlin definiert sind.

  • Sie können auch laufen ./gradlew :app:compileDebugJavaWithJavac --stacktrace um die Fehlerquelle herauszufinden.

    – starkej2

    12. Dezember 2017 um 21:54 Uhr

Ich hatte eine sehr ähnliche Situation mit a NonExistentClass Fehler in einem Projekt mit mehreren Modulen, das Dagger verwendet, und es stellt sich heraus, dass ich vergessen habe, die Kotlin-Bibliotheksabhängigkeit hinzuzufügen. Also, nur das Hinzufügen im Untermodul löste mein Problem:

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

  • Hatte fast das gleiche – in meinem Fall habe ich vergessen hinzuzufügen kotlin-android plugin zum build.gradle des Moduls.

    – Wjatscheslaw

    11. Juli 2019 um 11:16 Uhr

tldr: Ändern Sie kapt in annotationProcessor in build.gradle und Sie werden das eigentliche Problem sehen.

Ich habe den gleichen Fehler erhalten, und es stellte sich heraus, dass ich gerade eine Klasse auskommentiert habe, die ich in meiner AppComponent verwendet habe. Leider hat mir das Kapt-Tool nicht die richtige Fehlermeldung gegeben. Wenn Sie kapt im Compiler Ihrer Bibliothek in annotationProcessor ändern und versuchen zu bauen, wird es auch nicht gelingen, aber Sie erhalten eine detailliertere Fehlermeldung.

In meinem Fall hatte ich @Nullable Anmerkung von Support-Anmerkungen während ich es entfernt hatte, um zu migrieren AndroidX.
Da die Anmerkung beim Erstellen nicht korrekt importiert wurde, wurde sie als ungültig erkannt.

Was ich tat, war, den Code zu überprüfen und alle Importe zu reparieren.

  • Das war eigentlich mein Problem. Vielen Dank!

    – dipdipdip

    6. November 2019 um 19:21 Uhr

  • Ersetzen aller Importe von org.jetbrains.annotations.Nullable zu androidx.annotation.Nullable hat das Problem für mich behoben

    – Vaibhav Jani

    14. November 2020 um 6:14 Uhr

Benutzer-Avatar
CoolMind

Nach dem Entfernen der veralteten Bibliothek

implementation 'androidx.hilt:hilt-lifecycle-viewmodel:1.0.0-alpha03'
kapt 'androidx.hilt:hilt-compiler:1.0.0-alpha03'

Ich habe diesen Fehler:

incompatible types: NonExistentClass cannot be converted to Annotation 

Anschauen https://dagger.dev/hilt/view-model.html Ich habe in a gewechselt ViewModel:

class MainViewModel @ViewModelInject constructor(
    ...
) : ViewModel() {

zu

@HiltViewModel
class MainViewModel @Inject constructor(
    ...
) : ViewModel() {

  • Das war eigentlich mein Problem. Vielen Dank!

    – dipdipdip

    6. November 2019 um 19:21 Uhr

  • Ersetzen aller Importe von org.jetbrains.annotations.Nullable zu androidx.annotation.Nullable hat das Problem für mich behoben

    – Vaibhav Jani

    14. November 2020 um 6:14 Uhr

Benutzer-Avatar
GoRoS

Ich habe festgestellt, ob Sie verwenden

kapt {
    generateStubs = true
}

Wenn Sie zu false wechseln, wird der eigentliche Fehler angezeigt. Sie werden wahrscheinlich Probleme beim Erstellen des Dolchdiagramms haben, sobald die Kompilierungsprobleme behoben wurden, aber ändern Sie einfach wieder zu true, und Sie sollten gut sein

1205270cookie-checkFEHLER: error.NonExistentClass Kotlin In Multimodul-Dagger-Projekt

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy