Java
ant
Lombok

delombokする時はsourcepathを通そう、という話

More than 1 year has passed since last update.

あまり会社での内容は書くことなかったけど珍しく詰まったのでメモ。

しょーもないところで引っかかってましたがむーんというお話。


背景

インスペクションテストの導入に当って試しにプロダクトにテスト実行したところ検証不可のエラー。

内容としてはlombokで自動生成されるコードに対してはツールが解決できず、ファイル全体が検証対象から外れてしまうとのこと。

なのでlombokが用意している自動生成されるコードを出力できるdelombokの機能を利用して解析可能にしよう、というのが趣旨。javadoc生成などでも同様の手段が取られる事があるそう。


実現方法

ビルドにantを利用しているので、公式記載の例を元にantのターゲットに追加する。

https://projectlombok.org/features/delombok

一部差異があるのが、利用しているlombokのバージョンによって参照するclassが異なるようです。

利用しているバージョンに準拠して下記クラスを指定する。

<taskdef classname="lombok.delombok.ant.DelombokTask" name="delombok" classpath="lombok.jar" />


エラーandエラー

いざant delombokで実行するとエラー。

コードの出力時に一旦コンパイルをかける?のかライブラリが参照できてなさそう。

通常のコンパイルで利用しているclasspathを追加してライブラリを参照できるようにする。

<classpath refid="compile-classpath" />

これで無事コンパイルできるようになった、、、と思いきやまだエラー、、、

内容はまたコンパイルエラーで今度はプロダクト内のjavaファイルを参照できていないらしい。

通常javacでコンパイルするときはsrcdirオプションでsourcepathを明示的に指定してあげる必要がある。そうしないとjavaファイル内のパッケージのパスが解決できない。

delombokではその指定のオプションが例には記載がない。(antのホームディレクトリからよしなにしてくれると思ってた、、、)

ドキュメントなども見当たらずどのようなオプションを指定すればいいかもわからないまま何日かを過ごす、、、

結局delombokコマンドライン実行時のオプションから適当に記載すると正しく処理できた。

<delombok verbose="true" encoding="UTF-8" to="[処理後のファイル出力先]" sourcepath="[ソースパス]">

最終的に下記のようなターゲットになった。

  <target name="delombok">

<taskdef classname="lombok.delombok.ant.DelombokTask" name="delombok" classpath="lombok.jar" />

<delombok verbose="true" encoding="UTF-8" to="[処理後のファイル出力先]" sourcepath="[ソースパス]">
<fileset dir="処理対象ディレクトリ" includes="**/*.java" />
<format value="suppressWarnings:skip" />
<classpath refid="compile-classpath" />
</delombok>
</target>

公式でマニュアルかドキュメントないんでしょうか??

ありそうなもんですが見つけられなかった、、、

delombok後、マルチバイト文字がunicodeに置換されているものを戻すなど細々したスクリプトを用意したのはまた別で書きます。