2012-04-08

Antタスクのデバッグ (S2JDBC-Gen)

S2JDBC-Genのgen-entity等が出力するコードを変更するのに内部動作を調べていたんですがAntでそのままgen-entityタスクを実行するとEclipseでブレークポイントを付けても止まらないので Ant カスタムタスクのデバッグ方法:アーキテクト360を参考に下記のようなコードを書いて実行しています(Antのant.jarとant-launcher.jarが必要です)。

public class AntDebug {
public static void main(String[] args) {
org.apache.tools.ant.Main.main(
"-f s2jdbc-gen-build.xml gen-entity".split(" "));
}
}

これでS2JDBC-Gen(s2jdbc-gen-2.4.43.jar)内のclassファイルにブレークポイントを付けて止めることはできましたが、そのままだとソースを書き換えてテストすることができないので Seasar2 – Downloads からS2JDBC-Genのソース群をダウンロードしてsrc/main/java以下にjarと同じ構成で配置します。これでjarを弄らなくてもソースの方を変更すれば変更が反映されます(エラーになるファイルが若干ありましたが今回調べたかった箇所はエラーになるファイルが不要だったため単純に削除するだけで大丈夫でした) 。

また GenerateServiceCommand#doExecute() 等の中にブレークポイントを付けてもそれを呼び出している AbstractTask#executeCommand() がコマンドをJavaタスク内で実行しているせいかブレークポイントで止まらないので取り急ぎToStringBuilderを使って変数の内容を出力して確認しています…。

それとgen-entityした後の生成ファイル群を削除するのがすごく面倒だなぁ…と思いgen-entityする直前の状態をgit commit → gen-entity後にgit clean -dfで生成されたファイルをすべて削除、とすることで対処しています。便利ですがその後にEclipseのメニューで プロジェクト > クリーン しておかないと実行した時に「log4j:WARN No appenders could be found for logger」等と言われてエラーになるので注意です。