web-dev-qa-db-fra.com

ERREUR: error.NonExistentClass Kotlin Dans le projet Dagger multi-module

J'utilise Dagger 2 et Kotlin pour le développement Android . Mon projet est également un projet multi-module . Mon fichier settings.gradle ressemble à ceci:

include :app
include :lib

Je maintiens également le module lib.

Dans les fichiers de poignard (par exemple dans le composant), j'essaie d'obtenir l'élément d'un autre module. Par exemple:

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

L'objet Presenter est défini dans le module lib. Je travaillais dans un environnement Linux et j'utilise Android Studio 3 preview Canary 5. Le code fonctionne bien et je suis capable de générer un APK.

Mais ma société souhaitait générer le fichier APK à l'aide de la version stable d'Android Studio. J'utilise Android Studio 2.3.3.

Lors de la compilation du projet Android, j'ai rencontré cette erreur:

error: error.NonExistentClass

L'erreur apparaît lorsque 

:app:kaptDebugKotlin 

est effectuée et que la classe de poignard ne peut pas être trouvée, la classe est définie dans l'autre projet. Quelle peut être la solution de contournement possible pour cela? Désolé pour mon mauvais anglais.

14

La cause-racine

En gros, il n’ya pas grand chose à faire pour résoudre ce problème {lors de l’utilisation de kapt. Pour citer ce lien qui aborde le même problème dans une autre bibliothèque utilisant des pré-processeurs (OrmaDatabase):

Étant donné que Kotlin crée ses stubs avant l'exécution du traitement des annotations Java, Kotlin ne connaît rien d’OrmaDatabase et le nom du fichier déclaration dans les stubs sera error.NonExistentClass. Cela casse le Outil de traitement des annotations. C'est une sorte de limitation de kapt

Comment résoudre ce problème (la solution de contournement)

Utilisez simplement apt ou annotationProcessor pour exécuter le compilateur Dagger. Dès que j'ai changé:

kapt libs.daggerCompiler

à 

annotationProcessor libs.daggerCompiler

dans mon fichier build.gradle de niveau module, j'ai pu obtenir les erreurs. Une fois que vous avez corrigé les erreurs, vous devez redéfinir la ligne sur kapt, faute de quoi les classes de poignard ne seraient pas générées car elles sont définies dans Kotlin.

12
Iman Akbari

tldr: changez kapt en annotationProcessor dans build.gradle et vous verrez le vrai problème.

J'ai eu la même erreur, et il s'est avéré que je venais de commenter un cours que j'utilisais dans mon AppComponent. Malheureusement, l'outil kapt ne m'a pas donné le message d'erreur approprié. Si vous remplacez kapt par annotationProcessor par le compilateur de votre bibliothèque et tentez de construire, cela ne réussira pas non plus, mais vous obtiendrez un message d'erreur plus détaillé. 

2
Andras Kloczl

J'ai eu une situation très similaire avec une erreur NonExistentClass dans un projet multi-module en utilisant Dagger et il s'avère que j'ai oublié d'ajouter la dépendance de la bibliothèque kotlin. Donc, juste l'ajouter dans le sous-module a résolu mon problème:

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

J'ai trouvé si vous utilisez 

    kapt {
    generateStubs = true
}

changer à false présentera alors l'erreur réelle, vous aurez probablement des problèmes pour construire le graphe de poignard une fois que les problèmes de compilation auront été corrigés, mais revenez simplement à true et vous devriez être bon

1
ngatirauks

Il semble qu'il y ait un bug avec kapt, le nettoyage de projet devrait aider.

./gradlew clean
0
ArtKorchagin

J'ai eu le même problème récemment. Comme je m'engage parfois via Android Studio (3.4.c6), j'utilise l'option "Optimiser les importations" pour supprimer les importations inutilisées. Pour une raison quelconque, il a supprimé l'importation pour l'annotation Parcelize.

0
mjurekov