ビルドツールの本
仕事で一時期ビルド職人ぽいことをしていたので参考のため軽く復習しようと購入した本。著者は超入門シリーズなどで知られる掌田津耶乃さんです。
- ビルドツールの本
- Chapter 1 ビルドツールの基礎知識
- Chapter 2 Apache Maven
- Chapter 3 Mavenを使いこなす
- Chapter 4 Gradle
- Chapter 5 Gradleを使いこなす
- Chapter 6 SBT(Simple Build Tool)
- Chapter 7 Bazel
- まとめ:ビルドツールが概観できる本
Chapter 1 ビルドツールの基礎知識
1-1 ビルドツールとは?
- 開発プロジェクトの規模が大きくなってくると、ビルド作業、ライブラリや他のプロジェクトのインストール、テストの自動化、デプロイなどがどんどん大変になってくる。
- これらを解決するために生まれたのがビルドツール類。「ビルド」と名前にあるがビルド以外も行う。
- Java系のプロジェクトではビルドツールの中で使われる言語もJava仮想マシン上で動く言語のことが多い。
- ビルドツールは単体でコマンドベースでも使えるし、EcliseやIntelliJなどのIDE上でもビルドツールのコマンドを実行できるようにしていることが多い。
1-2 Dockerのセットアップ

Chapter 2 Apache Maven
2-1 Mavenの基礎知識
- 最初に生まれJava文化圏に普及した
Apache Antの後継。Antと違ってビルドに関する作業以外も含んでいる。 - プロジェクト直下の
pom.xmlに設定を記述。 - Antと違ってタスクごとに書かない。実行時はビルドなどのゴールを指定してコマンドを叩く。
- Maven用のセントラルリポジトリにJava関連の膨大なライブラリ類が管理されていてこれを使える。最大の功績。
- JUnitのテスト実行やJavadocなども最初から対応。プラグインで拡張可能。
- インストールはバイナリをダウンロードしてどこかに展開。Windowsならシステム変数で新規の
M3_HOMEにフォルダを指定、Pathに%M3_HOME%\binを追加。MacはPATHに追加するだけ。 - どこかのフォルダでコマンド
mvn archetype:generateで、対話形式でMavenプロジェクトが生成できる。ソースコート置き場は{プロジェクトルート}/src/でなく{プロジェクトルート}/src/main/javaのようになるのが特徴。後の他のツールにも受け継がれている。 - EclipseとIntelliJ IDEAでは、
pom.xml直接修正でもやれることをダイアログから選べたりタスクを実行したり、IDE上でも操作できる。NetBeansではさらにMavenプロジェクトをそのまま開ける。
2-2 pom.xmlの基本を覚える
- pomは
Project Object Modelの略。 <project>タグ内はプロジェクト情報。JavaScriptのnpmにおけるpackage.jsonと似たような感じ。artifactIdはgroupIdの中で一意である必要があり、プロジェクトの識別子のようなもの。<dependencies>の中に依存するライブラリを書く。ないものはセントラルリポジトリから探して入れてくれる。
2-3 基本的なゴールについて
mvn compileでtarget/classes配下にJavaクラスコンパイルされる。mvn test-compileでtarget/test-classes配下にテストクラスがコンパイルされる。mvn testでJUnitテスト実行。mvn packageでコンパイル後のjar作成など。target/{artifactIdの名前}-{バージョン指定}.jarが作られるmvn cleanでtarget/の下をお掃除。exec-java-pluginを利用するようpom.xmlのbuild-puglinsの中に書くと、コマンドmvn exec:javaでjavaコマンド実行ができる。- プラグインを追加すると、
mvn eclipse:eclipseでMavenプロジェクト→Eclipseプロジェクトへ変換 - プラグインを追加すると、
mvn eclipse:to-mavenでEclipseプロジェクト→Mavenプロジェクトへ変換 - プラグインを追加すると、
mvn eclipse:cleanでMavenプロジェクト→Eclipseプロジェクトへ変換したのを戻す IntelliJでも
mvn idea:ideaと同じようにできるmaven-jar-plugin利用を設定すると、mvn package実行で作ったjarファイルにmainクラスを指定してjavaコマンドから動かせるようになる。
2-4 セントラルリポジトリ
ここから検索可能。この本のスクショではいかにもApacheぽいサイトが載っていますが、今アクセスするとリポジトリマネージャーのNexusなどで有名なsonatype社のロゴが先頭に出ていて、時代の変遷を感じます。
なお最初にAntはビルドそのものが対象だがMavenはそれ以外の作業も広く対応...とありますが、Antでもタスクを書けばJUnitを実行したりJavaDocを生成したりはそんなに難しくはないですね。(むかーし色々やりました...懐かしい...)
Chapter 3 Mavenを使いこなす
3-1 リポジトリの利用
- インターネット上で誰でもアクセスできるセントラルリポジトリは、分類上は「リモートリポジトリ」。他にSpring フレームワークのリポジトリなどもこの「リモートリポジトリ」。pom.xmlの
<repositories>に書いておくと、mvn packageの過程でそこにアクセスしてライブラリを取ってこれる。 - これとは別に「ローカルリポジトリ」もある。
mvn packageでjarファイルを作った後、mvn installやmvn install:install-fileでローカルリポジトリに登録できる。Windowsだと実際の場所は{ホームディレクトリ}/.m2/repositoryにインストールしたライブラリが並ぶ。
3-2 デスクトップアプリケーション開発
mvn archetype:generate -DarchetypeGroupId={グループID} -DarchetypeArtifactId={アーティファクトID}で細かく特定のテンプレートをもとにプロジェクトを作成できる。- 所定の指定をするとGUIアプリケーションでSwingの後に主流になった
JavaFXのプロジェクトも生成できる。
こういう例も載っているのがありがたいですね。とはいえ2021~現在、JavaでGUIアプリを作る機会があるかというとだいぶなさそうな気も。
3-3 Webアプリケーションの開発
mvn archetype:generate -DarchetypeGroupId=org.apache.maven.archetypes -DarchetypeArtifactId=maven-archetype-webappで生成。{プロジェクトルート}/main/webappができてここにJSPを置いたりweb.xmlを置いたり。mvn packageコマンドで生成されるのもjarファイルでなくwarファイルに最初から設定されている。maven-jetty-pluginを入れると、TomcatなどWebサーバーにデプロイしなくても、コマンドmvn jetty:runで内臓のJettyがWebサーバーとして動いて動作確認できる。jersey-quickstart-webappというアーティファクトIDも用意されていて、JAX-RSによるRESTサービス用のプロジェクトも生成できる。中のファイル構成やpom.xmlなどが最初から設定済み。spring-boot-sample-jetty-archetypeというアーティファクトIDを使うと、Spring Bootフレームワーク版のプロジェクトも作れる。各レイヤーのサンプルのクラス群が用意されている。
3-4 Mavenの拡張
- セントラルリポジトリを検索して、求めるライブラリ情報を
pom.xmlに記述、プロジェクトの中で使う例を説明。 - プロジェクトの中にプロジェクトがある親子構成も実は作れる。構成や
pom.xmlの中が複雑になる。
プログラミング言語ごとにライブラリ管理ツールは主要なものが別にあったり、雛形作成系は主要Webアプリケーションフレームワークが持っていたり専用のライブラリがあったり差はありますが、改めて俯瞰すると根本的にはだいたいやっていることは同じです。
Java系では最も速いApache Antが2000/7月リリース。後続のMaven 1.0のリリースが2004/7、v2.0が2005/10、v3.0が2010/10。こうしたビルドツール系の流れの中では先駆者だし、他のツールの参考にもされたのだろうなあと思います。
Chapter 4 Gradle
4-1 Gradleの基礎知識
- Java仮想マシン上で動くスクリプト言語
Groovyがある。Javaの方言のような位置づけ。このGroovyを使ったビルドツール。Java、Scalaでよく使われる。 - XMLでなくGroovy言語で記述できるので柔軟、タスク単位で処理。実は中からAntga呼ばれたりMavenから移行できたり、他のツールとも統合している。Mavenのセントラルリポジトリも使えて便利。
Groovy言語自体のインストールは実はなくても動く。ダウンロードして展開後、システム環境変数
GRADLE_HOMEにインストール場所を指定して新規追加、Pathに%GRADLE_HOME%\bin;を追加。MacならPATHに追加するだけ。gradle init --type java-libraryでプロジェクトフォルダを生成。中に.gradle/ gradle/ build.gradle, gradlew など固有のフォルダ、ファイルがいくつか作られる。- ソース置き場は
src/main/javaなどでMavenの伝統を引き継ぐ。 - 設定ファイル
build.gradleがメインで、ここにプラグインの設定、リポジトリの設定、依存するライブラリなどを書いて実行。
4-2 開発環境での利用
EclipseにはGradle統合のプラグインがあって各種作業がEclipse上からも行える。build.gradleにEclipseプラグイン使用を書いておいてコマンドgradle eclipseで、Eclipse用のプロジェクトが作成できたりする。IntelliJは元から標準でGradleをサポート。同じくbuild.gradleにideaプラグイン使用を書いておいてコマンドgradle ideaで、IntelliJ用のプロジェクトが作成できる。NetBeansはGradle Supportというプラグインが必要。gradle --GUIコマンドで起動する、でGradle専用のGUIツールも実はある。
4-3 build.gradleの基本を覚える
- Groovy言語はJavaと同じようにプログラムが書けるが、Gradleで使うのはGroovyをベースにしたDSL(ドメイン特化言語)のイメージ。
build.gradleにtask taskName { ... }でいろいろ書いていく。前処理、後処理の挿入も可能。コマンドラインからの実行時の引数も受け取れる。- 頻出のJavaプラグインを使うと
gradle javaでビルドが走ってjarファイル生成が走る。 gradle buildだと言語を問わないビルド。- Javaプラグインを入れると、ほかに
compileJava, processResources, classes, test, jar, javadoc, cleanなど一般的なタスクが揃う。 - applicationプラグインを入れると、
gradle runでプログラム実行ができる。 - JUnitテストクラスを書いた後build.gradleに書けば、コマンド
gradle testで実行。テストのレポートも出力される。 - build.gradle で
mavenCentral()と書くと、リポジトリからのライブラリ取得にMavenセントラルリポジトリを使える。便利。
Chapter 5 Gradleを使いこなす
5-1 さまざまなプログラムの作成
- GUIアプリをJavaFXで開発する時は、特定の引数はないのでコマンドは
gradle initから。 - Webアプリを開発する時もコマンドは
gradle initから。フォルダやファイルは手で作り、build.gradleにservletなどのライブラリを書いておく。
5-2 さまざまなアプリケーションの作成
- EclipseでGradleプロジェクトを作るとWebアプリの構成にはなっていないので軽く直せばOK。Eclipseプロジェクトに変換するプラグインもある。
- IntelliJもWebアプリ専用のGradleプロジェクトはなし。
- RESTアプリケーションを作る際も
gradle initから。フォルダやファイルは手で作り、build.gradleに使うライブラリを書き、jetty経由で起動。 - Spring Bootを使ったWebアプリも
gradle initからで同様。ビルド後の実行はjava -jar {生成されたSpring Boot用のJAR}.jarで起動。 - Groovy言語のアプリを作る時だけは、
gradle init --type groovy-libraryになる。
5-3 Apache Antの利用
- Java文化圏の世界で最初に生まれて普及したAntの各種よく使うタスクも、実はGradleから呼べる。build.gradleに書くタスクの中に
ant.echoやant.mkdirのように書いていけばよい。 ant.importBuild {build.xmlの場所}と書くと、Antのビルドファイルbuild.xmlも呼べる。
ちょうど仕事でもちょっと触れていたので復習できてよい章でした。各種アプリケーションの作り方など、設定例も載っているので使う方には役に立つと思います。
まずAntが生まれてビルドツールという考え方も含めて普及→欠点を直して改良してMaven誕生→さらに改良してGradle誕生...の流れなので、子孫のGradleから始祖にあたるAntの機能も使えるのは面白いですね。
Chapter 6 SBT(Simple Build Tool)
6-1 SBTの基礎知識
www.scala-lang.org www.scala-sbt.org
- Scala言語をベースにしたビルドツール。Scala以外でも使える。
- インストールはWindowsはインストーラーが用意。
sbt new {テンプレート名}でプロジェクトフォルダ新規生成。コード置き場は{プロジェクトルート}/src/main/scalaで、MavenやGradleと同様。- 直下の
build.stbファイルがビルドファイルで、ここに変数などを記述。なくても動く。 sbt compileでコンパイル。sbt runでプログラム実行。sbt packageでjarファイル生成。- Eclipseにサポートはないが、専用プラグインを入れたものが別の
Scala IDEとして提供。(しかしその後更新が滞っているようです) - IntelliJにはJetBrains社公式の
Scalaプラグインがあり、タスク実行などもろもろ可能。 - NetBeansには
nbscalaというプラグインがあるが、NetBeans 8.1のみ対応。 - SBT自体が
ActivatorというGUIツールを持っている。activator ui コマンドでブラウザから起動、プロジェクトの管理や起動ができる。
6-2 SBTを使いこなす
build.stbにプロジェクト定義以外にタスクもScalaコードで書ける。依存ライブラリもこのファイルに記述。別ファイルに切り出すやり方もある。- JUnit実行も可能。
- Webアプリケーションの構成ではJavaサーブレットとScalaサーブレットが混在してもokで、
build.stbにJettyプラグインの記述をしてsbt -jetty:startで動く。 - Spring BootのWebアプリケーションの場合も構成に従いファイル準備後、
build.stbに対応した記述を書いておくとsbt runで動く。 - 最も使われるのがPlay Framework を使う場合で、こちらも準備後に
build.stbに対応した記述を書いておくとsbt runで動く。 - 前述のGUIツール Activatorから、
build.stbを出力することもできる。
自分的にはScalaは追っていないのでSBTは知らなかったのですが、こういうツールもあるのですね。最新はv1.4.6で2020/12リリースとなっています。
Chapter 7 Bazel
7-1 Bazelの基礎知識
- Googleが開発したOSSのビルドツール。多数の言語に対応、PythonやGroovy, Scalaでよく使われる。ビルドは独自言語で記述。とても高速で柔軟。
- インストールはLinuxかDockerに、wgetでインストーラーをダウンロードしてインストール。実験的なサポートのみだがWindowsに入れる手段も一応ある。
ワークスペース/プロジェクトフォルダ/src/main/javaのような構成。WORKSPACE,BUILDというファイルにビルド内容を独自言語で記述する。~/bin/bazel buildコマンド実行でビルド~/bin/bazel run bazel-appでmainメソッドが実行。
7-2 Bazelを使いこなす
7-3 Bazelの基本的な機能
マクロ名.bzlというファイルでマクロが定義でき、BUILDファイルから呼べる。マクロ内からコマンド実行など各種可能。
まったく知らなかったのですがこういうツールもあるのか...という感じ。なんとなくLinuxの中で作りこんだシェルスクリプトの延長のような感じがします。 その後あまり話を聞かないですが、2020年にAodroidオープンソースプロジェクトのビルドツールとしてこのBazelが採用されていますね。
最後には本書の2017年時点でのビルドツールの今後の展望が記述されています。本書の予想によれば...
- MavenはJavaビルドツールの代名詞だが、XMLベースなのがネック。
- Mavenの大きな功績であるセントラルリポジトリはずっと使われる。
- Gradleはスクリプト言語で書けるのが便利で、今後主流になりそう。
- SBTはJava/Scala言語のPlay Framework専用と思われがちで、それ以外のプロジェクトでも使われれば普及するかも。
- Bazelは一般的な普及でなく、とにかく高速のビルドを求めるようなケースで使うようなもの。こうした自社開発向けツールがOSSで公開されるという動きは今後も続きそう。
- 開発ツールが固定で提供するビルド手順より、自分たちで選択したビルドツールでビルドするやり方が多くなりそう。
大体2021年現在もこうなっているなあという感じです。
まとめ:ビルドツールが概観できる本
SBTとBazelは使う機会がなさそうなので多くの場合はMavenとGradleの情報が主になるかと思いますが、復習にはちょうど良い本でした。2017年2月発売とちょい古いですが、プロジェクトの土台を支えるこうしたビルドツール周りは変化のスピードはあまり激しくなので、十分役立つ内容でした。
掌田津耶乃さんの本は超入門シリーズなどは時々誤植が多かったり内容が薄かったりすることもあるのですが、本書はボリューム380ページ、かなりしっかり書いてある印象です。まだまだ多いであろう歴史あるJavaプロジェクトや、Android開発に携わっている方にはちょうど良いのではないでしょうか。

関連書籍
『EclipseではじめるJavaフレームワーク入門 第5版 Maven/Gradle対応』が2016年、同じく掌田津耶乃さんの本。総合的に扱った本ですがMavenとGradleの話も出ています。586ページと情報も詰まっていてけっこうおすすめです。
当ブログにも以前に読んだ時の感想記事があります。完全に余談ですがこの記事、けっこう今でも検索からのアクセスがあります。やはりJava関係の情報は検索されることが多いのだなあと思ったりします。
Gradleについては2014年なのでだいぶ古いですが、『Gradle徹底入門 次世代ビルドツールによる自動化基盤の構築』という本が出ています。
ビルドツールを専門に扱った本というとやはりあまりないですね。Java開発を総合的に扱った本や各種情報の載ったムック、特定のフレームワークの解説本などに、中の作業の一部としてビルドツールの話も一緒に載っているような体裁が多いです。