読者です 読者をやめる 読者になる 読者になる

Javaプロジェクトにおけるビルドツール2

前のエントリの続き。今回はどのような場面にどのツールがマッチするかを、自分なりの考えをふまえて紹介します。

https://cacoo.com/diagrams/2jC9IRIFq2N3z3wr-3AC36.png


ちなみに、それぞれのツールの使用経験はこんな感じ。

ビルドツール 使用経験
Ant 中〜大規模プロジェクトを1件
Maven 小〜中規模プロジェクトを複数件
Gradle 趣味のサンプルコードで複数件

SBT/Scalaは使ったことがないので除外。想像ですが、SBTをJavaプロジェクトで使うとなると、Gradle的な立ち位置になるかと思ってます*1

ソースコードJava以外も扱いたい場合

プロダクトコードには入れず、テストコードだけでGroovyを扱いたい場合も含みます。要するに、Java以外にコンパイルしたいソースコードがあるかどうか。

このケースでは、おとなしくGroovyを標準サポートしているGradleを使ったほうがいいかと思います。

Mavenでgroovyを扱えるようにする、GMavenというMavenプラグインもあるにはあります。ただ、メンテがあまりされていませんし、使ってみた感じちょっと挙動が怪しいなというところがちらほら。Groovy 1.8対応もJIRA上には上がっているのですが、まだ本家には取り込まれてません。

Mavenでサポートされていない)カスタム処理が入らない場合

ビルドプロセスがMaven(プラグイン含む)で解決できる範囲であまりカスタム処理が入らないならば、ビルドスクリプトの作成しやすさは以下のような感じになるかと思います。

Maven > Gradle >> Ant

やっぱりMavenのプラグインの豊富さは魅力的で、うまくはまればカスタムなコードを書かずにやりたいことが実現できます。Webや書籍の情報・ノウハウに関しても、まだGradleに比べてAnt/Mavenの方が豊富ですし。

ちなみに、Mavenプラグインで感動したのはMaven Release Pluginですね*2。これぞ自動化!といえるプラグインではないでしょうか。release pluginに関しては、ちょっと古い記事ですがこれも参考にしてみてください。

Mavenでサポートされていない)カスタム処理が入る場合

ただし、Mavenはプラグインを使っても解決できない or Mavenプラグインがそもそも提供されていないようなカスタム処理を組み込もうとすると、途端に難易度があがります。

Gradle > Ant >> Maven

Maven AntRun PluginでAntタスクを使ってカスタム処理を実現する方法などもあるにはありますが、多用するとメンテナンス性に欠けるので、個人的にはあまり好みじゃないです。かといって、そのような処理を記述するたびにMavenプラグインを自作するのも、ちょっと敷居が高いでしょう。

Antでは、Mavenのようなデフォルト構成が規定されておらず、従わなければならない構成・制約がない分だけカスタムな処理を記述しやすくはあります。ただ、前回も触れたように、そもそもXMLではIF文やFor文といった単純な制御構造を記述するのさえ一苦労です。Ant-Contribを使えば実装は少し楽できますが、メンテナンス性に乏しいのは変わらずです。

カスタム処理が(無視できないくらいに)入るなら、Gradleが第一候補になるでしょう。GradleはGroovyベースなので、IF・For文といった処理も容易に記述することができます。


結論

何の制約もないのであれば、これからのプロジェクトでAntを選ぶのはあまりメリットがないでしょう。コンパイルやユニットテストなどの基本的な処理も逐一記述しなければいけないのは正直面倒ですし、たとえ記述したとしても記述量が膨大になってメンテナンス性に欠けることになります。

MavenとGradle/SBTのどちらを選ぶかですが、そのプロジェクトでどれだけカスタムなビルド処理が入ってくるかによると思います。あとは、ビルドツールに携わる人の経験も考慮しつつ、適切と思われるツールを選択することになるでしょう。

個人的には、GradleのプラグインサポートがMaven並に手厚くなると嬉しいですね。

*1:Scalaを使ったことないので伝え聞いただけの中での個人的な意見としては、そもそもJavaScalaを併用することがあまりないのかなという印象。中途半端に併用すると、Java側にひきずられてScalaの良さをあまり引き出せないというイメージを持ってます。

*2:AntでMaven Release Pluginと同じようなことを実現しようとしたら、結構大変なことになりましたが…orz