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

[2011/08/23 追記] 続き書いた。Javaプロジェクトにおけるビルドツール2 - @ikikko のはてなダイアリー

1歳ちょっとの自分の子供を抱き上げると高確率で泣かれるikikkoです、こんにちは。早くこんな日がくるとイイですね。

http://dj-kaz.com/blog/2008/05/14/viploader641870.jpg.jpg
(※:画像はイメージです。実物とは異なる可能性があります。)


前々から色々と考えていたところがあったので、Javaプロジェクトにおけるビルドツールについて少しまとめてみました。とりあげたものは以下の4つ。

[http
//ant.apache.org/:title=Ant]:Apache Ant is a Java library and command-line tool whose mission is to drive processes described in build files as targets and extension points dependent upon each other.
[http
//maven.apache.org/:title=Maven]:Apache Maven is a software project management and comprehension tool.
[http
//www.gradle.org/:title=Gradle]:A better way to build
[https
//github.com/harrah/xsbt/wiki:title=SBT (Simple Build Tool)]:sbt is a build tool for Scala projects that aims to do the basics well.

なお、比較することを主としたので、各ツールでのビルドスクリプトの記述方法などは載せていません。

特徴

各ビルドツールの特徴一覧は以下のとおりです。

ビルドツール 依存ライブラリの管理 デフォルトプロジェクト構成の規定 記法
Ant △(Ivyで実現) x XML
Maven XML
Gradle Groovy
SBT Scala
依存ライブラリの管理

Mavenで導入された機能の一つとして、依存ライブラリを管理する機能があります。

例えば、Apache commons-langなどの外部ライブラリを使用したい場合、ツールの手助けがない状況ならば、自分でJarファイルをダウンロードしてクラスパスにつっこんでおく必要があります。ビルドツールに依存ライブラリを管理する機能があると、定められた書式にしたがって、記述しておくだけでJarファイルをネットワーク上からダウンロードしてくれます(各種IDEプラグインと連携すると、ダウンロードと同時にIDE上でのクラスパス設定も行ってくれます)。

Jarファイル一つだけダウンロードすればいいのであれば手動管理でもそこまで問題ないですが、そのライブラリが別のライブラリに依存してたりすると結局どこまでJarをダウンロードしておく必要があるかを手動で管理するのは、かなりしんどくなります。ビルドツールの依存ライブラリの管理機能では、そういった推移的な依存も適切に管理してくれます。

Ant単体では依存ライブラリを管理する機能はありませんが、Ivyを用いることによって依存ライブラリを管理することができます。GradleやSBTも依存ライブラリの管理機能が備わっていますが、内部的には、このIvyを使って実現しています。

デフォルトプロジェクト構成の規定

例えば、ソースコードをコンパイルして、ユニットテストを実行して、Jarファイルにパッケージングして…的なことは、(書き捨てのプログラムでなければ)大多数のプロジェクトで必要なプロセスでしょう。また、プロダクトコードやテストコード、プロパティファイルなどのリソースはどのディレクトリに配置するかも、特別な要件がない限りは大体いつも同じような構成となるでしょう。

こういった、普遍的なビルドのプロセスやディレクトリ構成は予め定義されていた方が、一から定義したときのコストや新規プロジェクトに参画した際の学習コストを抑えることができます。

これも、Mavenでプロジェクトのデフォルト構成が規定されました。Gradle/SBTでは基本的にMavenの構成を踏襲しつつ、各プロジェクトごとのカスタマイズを入れやすいように考えられています。

一例として、M2Eclipse(EclipseMavenプラグイン)で作成したプロジェクトの構造を、以下に貼っておきます。src/main/javaやsrc/test/javaといった各ソースコードを配置するディレクトリが、デフォルトで作成されています。
f:id:ikikko:20110802023107p:image

記法

Ant, MavenXMLで記述します。XMLは機械が処理しやすく、人間が見てもそこそこ分かりやすいというメリットはあるのですが、タグで囲む必要があるなどどうしても冗長になってしまいます。また、条件分岐や繰り返しといった単純な制御を記述するのもあまり得意ではありません。

一方、後発のGradle/SBTはそれぞれGroovy/Scalaといった、プログラミング言語を基とした内部DSLで記述します。もともとがプログラミング言語なので、制御構造も難なく記述することができます。


長くなったので、ここで一区切り。次のエントリでは、これらの特徴を踏まえた上でどういう場面にどのツールを選択するかを、今の自分の考えとともに紹介しようと思います。

[2011/08/23 追記] 続き書いた。Javaプロジェクトにおけるビルドツール2 - @ikikko のはてなダイアリー