wake-up-neo.com

FEHLER: error.NonExistentClass Kotlin In einem Multi-Modul-Dagger-Projekt

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

include :app
include :lib

Ich pflege auch das lib-Modul.

In den Dagger-Dateien (zum Beispiel in der Komponente) versuche ich, das Element von einem anderen Modul abzurufen. 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 einer 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 erscheint, wenn 

:app:kaptDebugKotlin 

ausgeführt wird und verursacht wird, dass die Dolchklasse nicht gefunden wird, wird die Klasse im anderen Projekt definiert. Was kann die mögliche Abhilfe dafür sein? Entschuldigung für mein schlechtes Englisch.

14

Die Hauptursache

Grundsätzlich kann nicht viel getan werden, um dieses zu beheben, wenn kapt verwendet wird. Um diesen Link zu zitieren, der dasselbe Problem in einer anderen Bibliothek anspricht, die Vorprozessoren (OrmaDatabase) verwendet:

Da Kotlin vor der Ausführung von Java Annotation Processing Stubs erstellt, wird Kotlin weiß nichts über OrmaDatabase und den Namen der Deklaration in Stubs ist error.NonExistentClass. Dies bricht die Anmerkungsverarbeitungswerkzeug. Es ist eine Art Kapt-Einschränkung

Wie man es beheben kann (die Problemumgehung)

Verwenden Sie einfach apt oder annotationProcessor, um den Dagger-Compiler auszuführen. Sobald ich mich geändert habe:

kapt libs.daggerCompiler

zu 

annotationProcessor libs.daggerCompiler

in meiner Modulebene build.gradle-Datei konnte ich die Fehler erhalten. Nachdem Sie die Fehler behoben haben, müssen Sie die Zeile wieder auf kapt setzen, da sonst keine Dolchklassen generiert werden, da sie in Kotlin definiert sind.

12
Iman Akbari

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

Ich bekam den gleichen Fehler und es stellte sich heraus, dass ich gerade eine Klasse auskommentiert habe, die ich in meiner AppComponent verwendete. Leider hat mir das kapt-Tool nicht die richtige Fehlermeldung angezeigt. Wenn Sie kapt in annotationProcessor im Compiler Ihrer Bibliothek ändern und versuchen, es zu erstellen, wird es ebenfalls nicht erfolgreich sein. Sie erhalten jedoch eine ausführlichere Fehlermeldung. 

2
Andras Kloczl

Fügen Sie dies einfach hinzu, um eine gradle-Datei zu erstellen, um die mit NonExistentClass verbundenen Probleme zu vermeiden

kapt {
 correctErrorTypes true 
} 

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

2

Ich hatte eine sehr ähnliche Situation mit einem NonExistentClass-Fehler in einem Multi-Modul-Projekt mit Dagger und stellte fest, dass ich vergessen habe, die Abhängigkeit der Kotlin-Bibliothek hinzuzufügen. Das Hinzufügen in das Untermodul löste also mein Problem:

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

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

Ich habe den Code überprüft und alle Importe korrigiert.

1
Mahdi-Malv

Ich habe diesen Fehler erhalten, als ich versehentlich eine Testklasse in mein Hauptquellenset verschoben habe. Durch Zurückverschieben in das Testquellenset wurde der Fehler behoben.

1
alexy

Ich habe gefunden, ob du verwendest 

    kapt {
    generateStubs = true
}

wenn Sie den Wert in false ändern, wird der tatsächliche Fehler angezeigt. Wenn Sie Probleme mit der Kompilierung behoben haben, werden Sie wahrscheinlich Probleme beim Erstellen des Dolchgraphen haben

1
ngatirauks

Es scheint, dass es einen Fehler mit kapt gibt, die Projektreinigung sollte helfen.

./gradlew clean
0
ArtKorchagin

Ich hatte kürzlich das gleiche Problem. Da ich mich manchmal über Android Studio (3.4.c6) festschreibe, verwende ich die Option "Importe optimieren", um nicht verwendete Importe zu entfernen. Aus irgendeinem Grund wurde der Import für die Parcelize-Anmerkung entfernt.

0
mjurekov

Ich habe diesen Fehler erhalten, als in meiner Injected-Klasse ein Kompilierungsfehler aufgetreten ist. Bitte stellen Sie sicher, dass keine Übersetzungsfehler vorliegen.

0
Anuj Garg

Es sind die Fehler aufgetreten, nachdem ich die .gradle-Version aktualisiert habe.

Die Version für Mockito wurde von 2.7.21 auf 2. + aktualisiert. Das Problem wurde für mich behoben.

-    androidTestCompile "org.mockito:mockito-Android:2.7.21" // remove this
+    androidTestCompile "org.mockito:mockito-Android:2.+"    // add this
0
Allen

Es scheint, dass kapt die Klasse nicht finden kann oder nicht bestimmen kann, welche Klasse verwendet werden soll. z.B.

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

@Abc
class Xyz { ... }
0
Wang Qian