Javaプロジェクトのビルドツール、Gradleにするか、Mavenにするか

最近になって突然理解した。 選択するときは、柔軟性とAPIの安定性のトレードオフを考えないといけない。

総合評価

「成果物のビルド」を改善する意思と時間の有無に応じて選択するとよさそう。 消極的な姿勢なら Maven を、前向きな姿勢なら Gradle を採用すればいいだろう。

  • ビルドスクリプトに高度な柔軟性が求められるなら、まずは構成を工夫して簡素化できないか試みた方がよい
    • どうしても簡素化できないなら柔軟性に優れた Gradle を採用するしかない
  • プロジェクトの積極的な開発は1年未満で終了する(消極的な維持、保守は継続する場合)
    • APIの安定性を重視して、Maven を採用する(維持や保守のためにビルドツールをメンテナンスするのはムダである)
  • プロジェクトの積極的な開発は1年以上継続する
    • 「成果物のビルド」を開発プロセスの一部として重視しており、改善し続ける意思があるなら Gradle を採用する
    • 「成果物のビルド」よりアプリケーション本体の拡充を中心とするなら Maven を採用する

柔軟性

Gradle は Groovy/Kotlin でスクリプトを記述できるし、プラグインプロジェクトをbuildSrcで管理できるため、柔軟性がとても高い。 それに比べて Mavenプラグインモデルはややこしいので、解決したい問題の重みとプラグインを自作する大変さが割に合わないことが多いと思う。

問題の規模 Gradle Maven 結論
公開プラグインで解決できる 同等
ビルド定義ファイルを工夫すれば解決できる Gradle
プラグインを自作すれば解決できる Gradle

APIの安定性

基本的にメジャーバージョンアップでは一部のAPIの互換性が損なわれる、あるいは、排除される場合がある。 そうするとビルドが壊れてしまうので、プロジェクトとしては追加の仕事が増えてしまうことになる。

リリースノートからメジャーバージョンアップの期日を取り出して並べてみるとこうなる。 Gradle は更新間隔が短く Maven は長い。 更新間隔が長いということは、APIの安定する期間が長いということだ。

Maven

バージョン 期日 前回のリリースからの期間
1.0 2004-07-13
2.0 2005-10-20 1年3ヶ月
3.0 2010-10-08 5年
3.1.0 2013-07-15 2年9ヶ月
3.6.3 2019-11-25 6年4ヶ月

Gradle

バージョン 期日 前回のリリースからの期間
v1.0 2012-06-12
v2.0 2014-07-01 2年1ヶ月
v3.0 2016-08-15 2年1ヶ月
v4.0 2017-06-14 10ヶ月
v5.0 2018-11-26 1年5ヶ月
v6.0 2019-11-08 1年
v6.8.2 2021-02-05 1年3ヶ月