Javaを使っているプロジェクトで既にAntの資産がある場合など、GradleからAntのbuild.xmlのtargetを実行したい場合などあるかと思います。
そのためのやり方を調べたのでメモがてら綴ります。
build.xmlをインポート
インポートするにはant.importBuild()メソッドを使います。
▼build.xmlにはechoするtargetを1つ用意
<?xml version="1.0" encoding="utf-8" ?>
<project name="antsample" default="target01">
<target name="target01">
<echo message="message01" />
</target>
</project>
▼build.gradle側でbuild.xmlを使えるようインポート
ant.importBuild 'build.xml'
▼build.xmlで定義したtargetが使えるようになっている
$ gradle tasks --all
〜省略〜
Other tasks
-----------
prepareKotlinBuildScriptModel
target01
$ gradle target01
> Task :target01
[ant:echo] message01
BUILD SUCCESSFUL in 846ms
1 actionable task: 1 executed
Antのtarget名とGradleのtask名が重複する場合
注意点として、build.xml上のtargetとにGradleに用意されているタスク名が重複するとエラーになります。
そのため、以下のようにantのtargetはant.【target名】で実行できるようにしておくと良さそうです。
ant.importBuild('build.xml') {
antTaskName -> "ant.${antTaskName}".toString()
}
$ gradle tasks --all
〜省略〜
Other tasks
-----------
ant.build
prepareKotlinBuildScriptModel
プロパティ設定方法
Ant実行時は-Dで引数を指定できましたが、Gradleでも同じことができます。
▼build.xml側でpropertyを定義します
<?xml version="1.0" encoding="utf-8" ?>
<project name="antsample" default="target01">
<property name="message" value="default message"/>
<target name="target01">
<echo message="${message}" />
</target>
</project>
▼Gradle側はbuild.xmlのインポートだけで大丈夫です
ant.importBuild 'build.xml'
▼メッセージを指定してechoさせることができました
$ gradle target01 -Dmessage='message param'
> Task :target01
[ant:echo] message param
BUILD SUCCESSFUL in 726ms
1 actionable task: 1 executed
まとめ
引数を指定してGradleからAntを実行させるだけでしたが、結構苦労しました。
最初はgradle.build側でant.propertiesとか使って引数渡したりしたてのですが、それは使わなくてもコマンドラインから直接「-D」でtargetを実行できたので、かなりスッキリしました。
GradleやGroovyは触ってて面白いので、また学んだことがあったら投稿していきます。
参考
Gradle User Guide
Gradle (build.gradle) 読み書き入門
以上、ありがとうございました。