1

を注釈付きクラスにアクセスする:AとB(私はここで注釈プロセッサと注釈モジュールが含まれていない)Androidの注釈プロセッサ私は2モジュールを搭載したアンドロイドStudioプロジェクト抱えている様々なモジュールから

Bが依存します

BはAndroidライブラリモジュールで、Aは単純なJavaライブラリモジュールです。私はまた、モジュールB上の注釈プロセッサを抱えている

私が直面してる問題がある:

は、私が注釈付きに配置されたファイルの両方のモジュールに基づいて、いくつかのコードを生成したい - AとB.この問題は、Annotation Processorの動作(ソースコードファイル* .javaのみで、コンパイルされた* .classのものではない)から発生します。残念ながら、Bのコンパイル時に、Annotation ProcessorはAからのソースファイルにアクセスできません。

唯一のことは、一種の解決策、モジュールAからの注釈付きクラスを含むフォルダをソースセットとしてモジュールBに含めることでした。この方法で、モジュールBはコンパイル時にこれらのファイルにアクセスできます。問題を解決

sourceSets { 
    main { 
     java { 
      srcDirs = ['src/main/java', '../module_A/src/main/java/path/to/annotated/classes/folder'] 
     } 
    } 
} 

- 今注釈プロセッサは、両方のモジュールからすべての注釈付きのクラスへのアクセス権を持っていますが、...

残念ながら、それは別の問題を紹介し...モジュールAからのもの注釈付きクラス現在2回コンパイルされています。モジュールAのJARファイルとモジュールBのAARファイルに含まれています。

質問1:モジュールAのソースファイルにアクセスするには、Bで動作する注釈プロセッサから別の方法がありますか? (私は見つけることができたところでは、答えは... NOですが、チェック)

質問2:私は、モジュールBのAAR最終パッケージからこれらのコンパイルされたファイル(繰り返されるもの)を除外することができますどのように?

質問3:多分...それは絶対に間違ったアプローチですか?助言がありますか?

ありがとうございます!

答えて

1

Nopでは、java.lang.model APIを使用するだけでは何もできません。少なくともいくつかの追加の術を必要とせずに。

問題はbinary-vs-sourceではありません。注釈プロセッサはコンパイルされたクラスだけでなく、ソース定義のクラスをinterospectするElements#getTypeElementを使用することができます。

Elements elementUtil = processingEnvironment.getElementUtils(); 
TypeElement integerClass = elementUtil.getTypeElement("java.lang.Integer"); 
TypeElement myClass = elementUtil.getTypeElement("currently.compiled.Class"); 

しかし、あなたはまだそれを観察するために、コンパイルクラスパスにクラスを持っている必要があり、そしてクラスがあることをコンパイルされているプロセスである必要がありますgetElementsAnnotatedWithに表示されます。

FastClasspathScannerのようなツールを使用して後で処理することができます。コンパイルされたバイトコードの注釈を見つけて、コンパイルプロセスとは別にレポートします。しかし、クラスパスの問題を回避することはできません。コンパイルのクラスパスに依存しない場合は、処理できません。1にそれらをマージすることで(あなたが行ったように)、または別に依存するものを宣言するのいずれかを介して - だから、モジュールを一緒にコンパイルするを持っている。後者の場合、あなたはgetElementsAnnotatedWithを使用することはできないかもしれないが、getTypeElementとFastClasspathScannerが動作します。

+0

あなたの答えのおかげで、私は少し混乱しています:現在の状態モジュールBにAにあなたの答えのための – ivtoto

+0

感謝を依存しますが、私は少し混乱しています:現在の状態では**モジュールBすでにA **に依存しています。 'の依存{プロジェクトコンパイル(「:A」)を}'それがコンパイル依存性として定義されているように、それは、Aからコンパイルされたクラスへのアクセスを有するべきです。そして、 'getTypeElement'あなたが私の答え@ivtoto – ivtoto

+0

を述べたが、既に'要素#getTypeElement'のドキュメントへのリンクを持っているについて、もう少し具体的ください可能性があります。私はそれを使用する例も追加しました。そこにはドキュメントがありますか、それはあなたにとっては不明ですか?たぶん、あなたはいくつかの研究を行い、おそらく追加の質問をするべきです。 – user1643723

関連する問題