web-dev-qa-db-ja.com

注釈プロセッサの順序を指定する

JavaプロジェクトでDagger2とLombokを実行しようとしています。もちろん、Lombokを最初に実行する必要がありますが、実際に実行するかどうかは偶然のようです。最初はクラスパス内のライブラリjarのそれぞれの位置で順序を指定できると思われますが、その順序は明らかに無視されます。

それらが何らかの方法で実行される順序を指定する方法はありますか、それとも2つのAPを組み合わせることができない状態で生きる必要がありますか?

SSCCEテストケース を作成しました。

シンプルな git clonemvn compileで問題を実証できます。App.Javaで18行目をコメントし、20〜21行目のコメントを外すと、18行目のLombok表記で同じコンストラクターが作成されても、コンパイルされます。問題は、ロンボクがダガーを追いかけているように見えることです。

24
Torque

多くの調査とLombok開発者の1人との話し合いの結果、javacはhashCode()に基づいてクラスの読み込みを行うため、このシナリオで実行されるアノテーションプロセッサの順序は基本的にランダムであり、さらに悪いことに、複数の間でランダムであることがわかりました。実行されます。現在、この問題の解決策はないようです。

私はlombok-mavenプラグインを使用して、すべてをデロンボクしました。これは完全ではなく、ややハッキーですが、少なくとも機能する結果が得られます。それがここに来る将来のグーグルを助けるかもしれないことを期待して、私は 作業バージョン をリポジトリにコミットしました。

20
Torque

理想的には、順序は重要ではありません。アノテーションプロセッサはcreateファイルのみを使用する必要があります-ファイルが作成されるたびに、別の処理ラウンドが開始され、他のプロセッサは新しいファイルで再び処理を実行する機会があります。この場合、順序は実際には重要ではないので、プロセッサの順序を強制する公式の方法はないと思います。問題は、Lombokプロセッサが新しいファイルを作成するのではなく、既存のファイルを操作することです。これは想定されていません。一部のコンパイラには、プロセッサを順序付けるオプションがある場合や、プロセッサがロードされる順序またはコマンドライン引数に表示される順序を使用する場合がありますが、それはコンパイラの実装によって異なります。

Daggersと Lombokのビルドプロセス を見て、そこで呼び出されるプロセッサを確認してみてください。次に、Mavenビルドでこれらのプロセッサーを正しい順序で明示的にセットアップし、さまざまなコンパイラーをテストして、それらのプロセッサーがこの順序で実行されるかどうかを確認します。

必要に応じて、コンパイルプロセスを分割し、最初に-proc:onlyを指定してLombokを実行し、その後、Lombokを使用せず、操作ファイルをオーバーライドせずに別のコンパイル手順を実行できます(可能な場合は、試したことはありません)。

11
kapex

-processorフラグを使用して、javacで注釈プロセッサの順序を指定することができます。ただし、このパラメーターを設定してもコンパイルできませんでした。 daggerがソースコードを直接見るか、アノテーションプロセッサAPIが同じラウンドでアノテーションプロセッサをスケジュールし、lombokによる変更が伝播されないのではないかと思います。

現在最も堅牢な解決策は、 delombok を使用して注文を強制することだと思います。

開示:私はロンボクの開発者です。

6
Roel Spilker