Javaプロジェクトのビルドツール、Gradleにするか、Mavenにするか
最近になって突然理解した。 選択するときは、柔軟性とAPIの安定性のトレードオフを考えないといけない。
総合評価
「成果物のビルド」を改善する意思と時間の有無に応じて選択するとよさそう。 消極的な姿勢なら Maven を、前向きな姿勢なら Gradle を採用すればいいだろう。
- ビルドスクリプトに高度な柔軟性が求められるなら、まずは構成を工夫して簡素化できないか試みた方がよい
- どうしても簡素化できないなら柔軟性に優れた Gradle を採用するしかない
- プロジェクトの積極的な開発は1年未満で終了する(消極的な維持、保守は継続する場合)
- プロジェクトの積極的な開発は1年以上継続する
柔軟性
Gradle は Groovy/Kotlin でスクリプトを記述できるし、プラグインプロジェクトをbuildSrc
で管理できるため、柔軟性がとても高い。
それに比べて Maven のプラグインモデルはややこしいので、解決したい問題の重みとプラグインを自作する大変さが割に合わないことが多いと思う。
問題の規模 | Gradle | Maven | 結論 |
---|---|---|---|
公開プラグインで解決できる | ○ | ○ | 同等 |
ビルド定義ファイルを工夫すれば解決できる | ○ | △ | Gradle |
プラグインを自作すれば解決できる | ○ | △ | Gradle |
APIの安定性
基本的にメジャーバージョンアップでは一部のAPIの互換性が損なわれる、あるいは、排除される場合がある。 そうするとビルドが壊れてしまうので、プロジェクトとしては追加の仕事が増えてしまうことになる。
リリースノートからメジャーバージョンアップの期日を取り出して並べてみるとこうなる。 Gradle は更新間隔が短く Maven は長い。 更新間隔が長いということは、APIの安定する期間が長いということだ。
バージョン | 期日 | 前回のリリースからの期間 |
---|---|---|
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ヶ月 |
バージョン | 期日 | 前回のリリースからの期間 |
---|---|---|
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ヶ月 |