知識ゼロからAnt と Maven と Gradle について勉強する。-ビルドの定義からツールの特徴まで

知識ゼロからAnt と Maven と Gradle について勉強する。-ビルドの定義からツールの特徴まで

こんばんは。七色メガネです。

今日はビルドツールである Ant と Maven と Gradle について勉強します。

前提

筆者の知識レベル

限りなくゼロ。前の職場が Ant だったけれども、用意された環境構築手順以上のことに触れなかったので知識は無い。

勉強動機

今の仕事で Gradle と Maven を使うので。

何でこの3つ?

どうせビルドツールを勉強するなら、有名な3つを比較しながら学んだ方が得るものが多いと思われたため。

ビルドツールについて

ビルドって?

対象の環境でプログラムを実行できるように、アプリケーションやライブラリを組み立てること。
ソースコードの解析、プログラミング言語から機械語へのコンパイル、ライブラリのリンクなどを経て実行ファイルを作成する。テストコードの実行なども行う。

ビルドとコンパイルの違いは?

コンパイルは「プログラミング言語を機械語に翻訳する」ことで、ビルド処理の一部。

ビルドの方法って?

  1. 手動ビルド
    ビルドに必要な処理を全て人間の手で一つ一つ行う。
    ミスが起きる。時間がかかる。面倒。
  2. ビルド処理をスクリプト化する
    ビルドに必要な処理をスクリプトに起こして実行する。
    処理が固定化されるので、無駄な処理を省略できない。
    (コンパイルは成功したがテストに失敗した時、次にもう一度ビルドスクリプトを叩くとコンパイルからやり直してしまう)
  3. ビルドツール
    主に、ビルドを構成するタスク(解析、コンパイル、テスト実行など)を個別に定義しそれを実行するツールの総称。
    タスクを管理しながら実行するため、ビルドスクリプトのような無駄な作業が発生しにくい。
    ファイル更新を監視し自動でタスクを実行する(etc. ソースコードの再解析)など高度な機能をもつツールが多い。

どんなビルドツールが有名?

  • Ant
  • Maven
  • Gradle
  • Bazel
  • Grunt
  • Gulp
  • SBT

Ant

Ant って?

  • Apacheプロジェクトが開発・公開している Javaプログラムのビルドツール。
  • ビルドファイルは[ build.xml ]。
  • 「Ant ビルド」で検索すると2000年代の記事がたくさんヒットする。

良いところ、悪いところ

  • Eclipse に標準で組み込まれている。
  • インクリメンタルビルド(ビルド処理を行うタスクは、処理が必要なもののみに限定される)に対応。
  • 各種Java開発ツールに対応。
  • ビルドファイルがXMLで記述されるので可読性が低い。
  • ビルドファイルがXMLで記述されるので自由度が低い。
  • ライブラリの依存解決機能を持っていない。
  • システムが大きくなるとビルドファイルが肥大化する。

Maven

Maven って?

  • Ant に代わるものとして作られた、Javaプログラムのビルドツール。
  • POM (Project Od Model) の考え方に基づく。
  • ビルドファイルは [ pom.xml ]。

良いところ、悪いところ

  • プラグインによる拡張が可能。
  • ビルドファイルへの記述内容が、Ant における build.xml よりも簡略である。
  • ライブラリの依存解決機能を持っている。
  • ビルドファイルがXMLで記述されるので可読性が低い。
  • ビルドファイルがXMLで記述されるので自由度が低い。

Gradle

Gradle って?

  • Ant や Maven のコンセプトに基づいて開発されたビルドツール。
  • Java開発のデファクトスタンダードになりつつある。
  • ビルドファイルは [ build.gradle ] 。

良いところ、悪いところ

  • AndroidStudio でデフォルト。
  • ライブラリの依存解決機能を持っている。
  • ビルドファイルが Groovy と言うJavaに近いプログラミング言語で記述される為、XMLよりも可読性が高い。
  • ビルドファイルが Groovy と言うJavaに近いプログラミング言語で言語で記述される為、XMLよりも自由度が高い。
  • シンタックスシュガー(略記) が多く慣れるまで読みにくい。
  • 結局学習コストは低くない。

 

ビルドツールの特徴まとめ

  • Ant はビルドツールとして優秀ではあったが、ビルドファイルがXMLであるために読みにくかったり肥大化してしまいやすかったりと、改善の余地が多くあった。
  • Maven は Ant に代わるビルドツールとして作成された。ビルドファイルは軽量化し、新たな機能としてライブラリの依存解決ができるようになり、より優れたビルドツールとしての地位を確立した。しかしビルドファイルはXMLのままだった。
  • Gradle は Maven と同じようにライブラリの依存解決機能を持ちつつ、ビルドファイルを Groovy と言う可読性の高い言語で記述することを達成した。ようやく人々はXMLから解放されたのだ。
  • 後発のビルドツールは先行するビルドツールの欠点を補うよう作られたため、現在は Gradle がデファクトスタンダードの地位を確立しつつある。しかしGradleのビルドファイルはXMLよりも読みやすいとはいえ、Groovy と言う言語を覚える必要があり、またGroovyならではの難しさもある。
  • ビルドツールとして Gradle を選択するのは間違いでは無いが、スタンダードだから簡単に扱えると言う認識は誤りである。

ビルドしてみる

3種のビルドツールについての違いが何となくわかったので、Maven と Gradle でビルドしてみる。
(Ant…? 知らないですね…。)

なお雰囲気を見るテストなので、細かいことはあまり気にしない。
ビルドファイルの文法もとりあえず雰囲気で書く。

準備

  • 次のディレクトリを作る。
    mavenTest/src/main/java/hello
    gradleTest/src/main/java/hello
  • ハローとsayするプログラムを作って、それぞれのsrcディレクトリの中に入れておく。(プログラムの中身は一緒)
Hello.java

Greeter.java

共通仕様

  • Java は1.8。
  • ハローとsayする。
  • 外部ライブラリの joda-time をビルドツールに拾わせて、javaで時刻を出力する。

Maven でビルド

  • 1: Maven をインストールする。(Mac)

  • 2: mavenTest/ に pom.xml を作成する。
pom.xml

  • 3: ビルドする。

  • 4: 起動する。

Gradle でビルド

  • 1: Gradle をインストールする。(Mac)

  • 2: gradleTest/ にbuild.gradle を作成する。
build.gradle

  • 3: ビルドして起動する。

結果考察

XMLのビルドファイルは読みにくい。(それだけ?)

全体まとめ

  • ビルドツールの歴史が Ant → Maven → Gradle と進んでおり、後発が先行ツールを強く意識して改善を試みている。ので、今から勉強するなら Gradle を抑えるのが良さそう。
  • Ant / Maven のビルドファイルがXMLで読みにくいから Gradle で Groovy になった。けれどもそれは「慣れれば読みやすい」の域を出ないのであって、初学者にとっては結局どっちも読みにくい。Gradle だから学習コストが低いと言うことはない。

 

参考

https://www.atmarkit.co.jp/ait/articles/1105/23/news128.html
https://qiita.com/Mura-Mi/items/225825cc3715dc04d923
https://qiita.com/tarosa0001/items/93c19155bc803f10cea0
https://thinkit.co.jp/cert/tech/3/11/4.htm
https://www.ossnews.jp/oss_info/Apache_Ant
https://www.techscore.com/tech/Java/ApacheJakarta/Maven/1/
https://qiita.com/vvakame/items/83366fbfa47562fafbf4
https://qiita.com/tatesuke/items/6e30dc8891d0857f240e
https://www25.atwiki.jp/dotcom/pages/337.html

Knowledgeカテゴリの最新記事