Ant + Ivy vs Maven

ビルドシステム構築スキルの重要性 - 達人プログラマーを目指してに関連して、開発プロジェクトで決定しなくてはならないことの一つに、Antを使うかMavenを使うかという判断があります。この両者に関してはそれぞれに信者の方がいて宗教論争のようなところもあるのですが、実際どちらの方が人気が高いのでしょうか?
Mavenの熱烈なファンの方もいる一方で、Maven地獄などという言葉もあるようにMavenでひどい目にあった人もいるようです。そういう人はAnt+Ivyの方が軽くてよいと言います。さらに、
議論:Mavenはビルドに適したツールか?
などを見るとなんとなくMavenはいまいちな印象を受けてしまいますし、Springも当初Maven化するという予定であったのに、
Spring switching to Maven? Oh no, think twice!
などの発言もあり、結局Spring3のビルドシステムはAnt+Ivyで構築されています。
私の現状の理解では、模式的に以下の図のようになるのではないかと考えています。

つまり、一般的なスクラッチ開発とパッケージ開発の選択と同様に以下のように考えるのがよいのではないでしょうか。

  • 1の領域ではビルド要件が簡単過ぎるのでわざわざMavenを導入するのが馬鹿らしい
  • 2の領域ではMavenで大いにビルドが簡略化される
  • 3の領域ではMavenの柔軟性に限界があるため、拡張に苦労させられる。Antの独自スクリプトの方が結局楽

結局ある程度パターン化されたアプリケーション(warファイル一つとか)だとアーキタイプ自動生成などもあるため、Mavenは非常に便利なのですが、きわめて複雑なケースだと拡張が大変でMaven地獄に陥るという状態になるのではないでしょうか。たとえば、以下のやり方をMavenで記述する方法をすぐに思いつく人は相当の達人だと思います。

  • 開発環境、ステージング環境、本番環境でアーティファクトの内容を切り替える
  • earファイルのlibフォルダーとwarファイルのlibフォルダーに格納するjarを正しく分ける*1
  • WeblogicJBossなどの複数のターゲットをサポートする(当然warやearに含める内容が変わる)
  • アプリサーバーのlibフォルダーに配置するターゲットとwarに含めるターゲットを分ける
  • リリース用のtarファイルを作成しサーバーにsftpでアップする
  • 特定のブランチを元に修正し古いバージョンでビルドしなおす
  • 変更差分のみのリリースを行う

それで、結局は賢く使い分けるしかないのではないかと思います。(もちろん、部分的に両者を併用することは可能です。基本的にMavenフレームワークなどjarを作っておしまいという場合は問題ないのですが、サーバーのデプロイを自動化するなど最終的にアセンブルする機能が弱点のようですので、そういう範囲でAntを併用するのがよいかもしれません。)
なお、Maven2が今まで必要以上に人気がなかったのは、英語も含めてドキュメントがいい加減で、入門的な内容の範囲を超えると、どのように使ってよいのかということがわかりにくく、高度な知識に関するノウハウがほとんど知られていなかったということもあると思います。

Maven: The Definitive Guide

Maven: The Definitive Guide

などのかなり詳しい本が出たこともあり、環境別ビルドの方法とか、pomの共通化、assemblyプラグインを使った配置などのテクニックが理解されるようになって、近年ではMavenの良さが再度見直されてきているようです。
Maven over Ant + Ivy: A Team Perspective by Les Hazlewood
※この本はPDFでよければ以下から無料でダウンロードすることもできます。ダウンロードする際にユーザー登録する必要があります。*2
News and Notes from the makers of Nexus | Sonatype Blog
対して、上級者向けのAntの参考書としては以下がお勧めです。
Ant in Action: Covers Ant 1.7 (Manning)

Ant in Action: Covers Ant 1.7 (Manning)

単にAntのタスクの説明が列挙してあるだけでなく、大規模なビルドシステムの構築ノウハウが書かれています。あまり知られていないようですが、ビルド職人としてやっていく上では非常に参考になる良書です。これらの専門書が共に翻訳されていないところもあり、このレベルの専門知識のあるプログラマーが少ないのがつらいところです。
なお、最近まで知らなかったのですが、先月Maven3がリリースされているようです。
Maven 3.0リリース
性能向上など内部的な改善はあるものの外部仕様は以前とそれほど変わりないようですが。基本的にMaven2との互換性を重視しているようです。

*1:earに複数のwarファイルが含まれているような場合、jarファイルをearレベルで格納して共有したいということがある。これは簡単そうで、実は、現状mavenの最大のはまりポイントとなる。earを使う場合でjarの共有を完璧に最適化したいなら現状antを使うべきか。http://docs.codehaus.org/display/MAVENUSER/Solving+the+Skinny+Wars+problem

*2:アメリカの州を入力する欄が必須項目になっていて何を入れたらよいか迷いますが、とりあえずAlaskaなど適当に入力すればOKです。