web-dev-qa-db-ja.com

エラー:error.NonExistentClass Kotlin In multi module Dagger project

Android開発にDagger 2とKotlinを使用しています。私のプロジェクトもマルチモジュールプロジェクトです。settings.gradleファイルは次のようになります。

include :app
include :lib

また、libモジュールのメンテナンスも行っています。

ダガーファイル(コンポーネントなど)で、他のモジュールからアイテムを取得しようとします。例えば:

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

Presenterオブジェクトはlibモジュールで定義されています。私はLinux環境で働いていて、Android Studio 3プレビューカナリア5を使用しています。コードはうまく機能しており、APKを生成できます。

しかし、私の会社は、安定したバージョンのAndroid Studioを使用してAPKを生成したいと考えていました。Android Studio 2.3.3。

Androidプロジェクトをコンパイルすると、このエラーが発生しました。

error: error.NonExistentClass

エラーが表示されるのは

:app:kaptDebugKotlin 

実行され、短剣クラスが見つからないことが原因で、クラスが他のプロジェクトで定義されています。これの可能な回避策は何ですか?私の悪い英語でごめんなさい。

22

根本原因

基本的に、これを修正するためにできることはあまりありませんkaptを使用する場合。プリプロセッサ(OrmaDatabase)を使用する別のライブラリで同じ問題に取り組む このリンク を引用するには:

KotlinはJava Annotation Processingが実行される前にスタブを作成するため、KotlinはOrmaDatabaseについて何も知らないため、スタブ内の宣言の名前はerror.NonExistentClassになります。これはAnnotation Processingツールを破壊します。カプトの制限の種類

修正方法(回避策)

Daggerコンパイラーの実行には、プレーンaptまたはannotationProcessorを使用します。変更したらすぐに:

kapt libs.daggerCompiler

annotationProcessor libs.daggerCompiler

私のモジュールレベルでbuild.gradleファイル、エラーを取得できました。エラーを修正したら、行をkaptに戻す必要があります。そうしないと、ダガークラスはKotlinで定義されているため生成されません。

20
Iman Akbari

Daggerを使用するマルチモジュールプロジェクトでNonExistentClassエラーが発生し、kotlinライブラリの依存関係を追加するのを忘れていたことがわかりました。したがって、サブモジュールに追加するだけで問題が解決しました。

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

tldr:build.gradleでkaptをannotationProcessorに変更すると、実際の問題が表示されます。

同じエラーが発生し、AppComponentで使用していたクラスをコメントアウトしたことがわかりました。残念ながら、kaptツールは適切なエラーメッセージを表示しませんでした。ライブラリのコンパイラでkaptをannotationProcessorに変更してビルドしようとすると、どちらも成功しませんが、より詳細なエラーメッセージが表示されます。

3
Andras Kloczl

NonExistentClassに関連する問題を回避するために、これをgradleファイルをビルドするために追加するだけです

kapt {
 correctErrorTypes true 
} 

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

2

私の場合、@Nullable注釈をsupport-annotationsからAndroidXに移行するために削除しました。
構築時に、注釈が正しくインポートされなかったため、無効として検出されました。

私がしたことは、コードをチェックし、すべてのインポートを修正することでした。

1
Mahdi-Malv

誤ってテストクラスをメインソースセットに移動したときに、このエラーが発生しました。テストソースセットに戻すと、エラーがなくなりました。

1
alexy

あなたが使用している場合、私は見つけました

    kapt {
    generateStubs = true
}

falseに変更すると実際のエラーが表示されます。コンパイルの問題が修正されると、おそらくDagger Graphの作成で問題が発生しますが、単にtrueに戻すだけでよいはずです。

1
ngatirauks

Kaptにバグがあるようです。プロジェクトのクリーニングが役立つはずです。

./gradlew clean
0
ArtKorchagin

最近同じ問題がありました。私は時々Android Studio(3.4.c6))を使用してコミットするため、[インポートの最適化]オプションを使用して未使用のインポートを削除します。

0
mjurekov

Injectedクラスでコンパイルエラーが発生したときに、このエラーを受け取りました。コンパイルエラーがないことを確認してください。

0
Anuj Garg

.gradleバージョンをアップグレードした後、エラーが表示されました。

Mockitoのバージョンを2.7.21から2. +にアップグレードすると、問題が修正されました。

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

Kaptはクラスを見つけられないか、使用するクラスを決定できないようです。例えば.

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

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