2

今日、私は奇妙な問題に遭遇していました。私の google-fu では不十分であることが判明したため、それに関する詳細情報を入手したいと思います。

どうしたの

シナリオは次のとおりです。単純な Netbeans プロジェクトがあります。このプロジェクトには、コンパイル中にファイルを作成するために.javaNetbeans 注釈プロセッサ (正確には) によって処理されるいくつかの注釈を使用するファイルが含まれています。org.openide.filesystems.annotations.LayerGeneratingProcessor.xml

注釈プロセッサの依存関係を新しいプロジェクト (つまり ) に追加するのを誤って忘れた今日まで、これらはすべて正常に機能していましたcore/org-openide-filesystems.jar。その依存関係が存在しないと、私は最も奇妙な動作を目撃しました。ビルド (Netbeans を介して、およびコマンドラインの ant を介して直接)​​ は成功したと報告されますが、.classファイルはまったく生成されませんでした。

本当に私を失望させたのは、ビルド呼び出しが成功して戻ってきたことです。何かが間違っているという警告やその他の兆候は1つもありません..クラスが生成され.jarず、ファイルのみを含む小さな小さなファイルがありましたが、Bundle.propertiesファイルはありませんでし.classた。

回避策

シナリオ自体は以上です。しばらくして、最終的にjavac、コンパイラが何かが間違っていることを最終的に教えてくれるオプションについて知るようになりました: -XDdev. 私はこれまでこのオプションを見たことがなく、グーグルで調べたところ、これらの種類のオプションはHidden Optionsと呼ばれていることがわかりました。しかし、どの隠しオプションが利用可能で、それらが何に役立つかについての適切なリストを見つけられませんでした。それについての参照は大歓迎です。

とにかく、このオプションをコンパイルに追加すると、実際のjavac呼び出しで大きなスタックトレースが吐き出され、最終的ClassNotFoundExceptionLayerGeneratorProcessorクラスの に要約されます。そのクラスの依存関係をプロジェクトに追加すると、すべてが再び正常にビルドされます。

残りの問題

(怖いのと同じように) 面白いのは、この例外が stderr に出力され、注釈処理が失敗したことを示しているにもかかわらず、javac 呼び出し全体が成功することです! それでもビルドが成功して戻ってきて、すべてがうまくいったかのように動作します。このオプションがなければ、-XDdev何かがうまくいかなかったという出力からの兆候さえまったくありません。

最後に、私の実際の質問: この動作を適切なエラーに変える方法はありますか? 問題を-XDdev見つけることは問題ありませんが、ビルド出力を確認する必要があり、特に CI コンテキストでは実行できません。何らかの形でこの動作を適切なビルド エラーに切り替えて、そのような場合に CI システムからも通知されるようにすることで、他の人や自分自身が将来誤って依存関係を忘れないようにしたいと考えています。

4

0 に答える 0