ビルドツールの本
仕事で一時期ビルド職人ぽいことをしていたので参考のため軽く復習しようと購入した本。著者は超入門シリーズなどで知られる掌田津耶乃さんです。
- ビルドツールの本
- 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開発を総合的に扱った本や各種情報の載ったムック、特定のフレームワークの解説本などに、中の作業の一部としてビルドツールの話も一緒に載っているような体裁が多いです。