Rのつく財団入り口

ITエンジニア関連の様々な話題を書いているはずのブログです。

【感想】Javaビルドツール入門 Maven/Gradle/SBT/Bazel対応

ビルドツールの本

 仕事で一時期ビルド職人ぽいことをしていたので参考のため軽く復習しようと購入した本。著者は超入門シリーズなどで知られる掌田津耶乃さんです。

Chapter 1 ビルドツールの基礎知識

1-1 ビルドツールとは?

  • 開発プロジェクトの規模が大きくなってくると、ビルド作業、ライブラリや他のプロジェクトのインストール、テストの自動化、デプロイなどがどんどん大変になってくる。
  • これらを解決するために生まれたのがビルドツール類。「ビルド」と名前にあるがビルド以外も行う。
  • Java系のプロジェクトではビルドツールの中で使われる言語もJava仮想マシン上で動く言語のことが多い。
  • ビルドツールは単体でコマンドベースでも使えるし、EcliseやIntelliJなどのIDE上でもビルドツールのコマンドを実行できるようにしていることが多い。

1-2 Dockerのセットアップ

  • 本書に登場するBazelのように、Unix/Linux上ベースで作られているビルドツールもあり、そんな時はDockerを使うこともある。

f:id:iwasiman:20210813211130p:plain
Javaビルドツール入門 ビルドツールを学ぼう

Chapter 2 Apache Maven

2-1 Mavenの基礎知識

  • 最初に生まれJava文化圏に普及したApache Antの後継。Antと違ってビルドに関する作業以外も含んでいる。
  • プロジェクト直下の pom.xml に設定を記述。
  • Antと違ってタスクごとに書かない。実行時はビルドなどのゴールを指定してコマンドを叩く。
  • Maven用のセントラルリポジトリJava関連の膨大なライブラリ類が管理されていてこれを使える。最大の功績。
  • JUnitのテスト実行やJavadocなども最初から対応。プラグインで拡張可能。

maven.apache.org

  • インストールはバイナリをダウンロードしてどこかに展開。Windowsならシステム変数で新規のM3_HOMEにフォルダを指定、Pathに %M3_HOME%\bin を追加。MacPATHに追加するだけ。
  • どこかのフォルダでコマンド mvn archetype:generate で、対話形式でMavenプロジェクトが生成できる。ソースコート置き場は {プロジェクトルート}/src/ でなく {プロジェクトルート}/src/main/java のようになるのが特徴。後の他のツールにも受け継がれている。
  • EclipseIntelliJ IDEAでは、pom.xml 直接修正でもやれることをダイアログから選べたりタスクを実行したり、IDE上でも操作できる。NetBeansではさらにMavenプロジェクトをそのまま開ける。

2-2 pom.xmlの基本を覚える

  • pomはProject Object Modelの略。
  • <project>タグ内はプロジェクト情報。JavaScriptのnpmにおけるpackage.jsonと似たような感じ。
  • artifactIdgroupIdの中で一意である必要があり、プロジェクトの識別子のようなもの。
  • <dependencies>の中に依存するライブラリを書く。ないものはセントラルリポジトリから探して入れてくれる。

2-3 基本的なゴールについて

  • mvn compiletarget/classes 配下にJavaクラスコンパイルされる。
  • mvn test-compiletarget/test-classes 配下にテストクラスがコンパイルされる。
  • mvn testJUnitテスト実行。
  • mvn packageコンパイル後のjar作成など。target/{artifactIdの名前}-{バージョン指定}.jar が作られる
  • mvn cleantarget/の下をお掃除。

  • exec-java-pluginを利用するようpom.xmlbuild-puglinsの中に書くと、コマンド mvn exec:javajavaコマンド実行ができる。

  • プラグインを追加すると、mvn eclipse:eclipseMavenプロジェクト→Eclipseプロジェクトへ変換
  • プラグインを追加すると、mvn eclipse:to-mavenEclipseプロジェクト→Mavenプロジェクトへ変換
  • プラグインを追加すると、mvn eclipse:cleanMavenプロジェクト→Eclipseプロジェクトへ変換したのを戻す
  • IntelliJでも mvn idea:idea と同じようにできる

  • maven-jar-plugin利用を設定すると、mvn package実行で作ったjarファイルにmainクラスを指定してjavaコマンドから動かせるようになる。

2-4 セントラルリポジトリ

search.maven.org

ここから検索可能。この本のスクショではいかにもApacheぽいサイトが載っていますが、今アクセスするとリポジトリマネージャーのNexusなどで有名なsonatype社のロゴが先頭に出ていて、時代の変遷を感じます。

なお最初にAntはビルドそのものが対象だがMavenはそれ以外の作業も広く対応...とありますが、Antでもタスクを書けばJUnitを実行したりJavaDocを生成したりはそんなに難しくはないですね。(むかーし色々やりました...懐かしい...)

Chapter 3 Mavenを使いこなす

3-1 リポジトリの利用

  • インターネット上で誰でもアクセスできるセントラルリポジトリは、分類上は「リモートリポジトリ」。他にSpring フレームワークリポジトリなどもこの「リモートリポジトリ」。pom.xml<repositories>に書いておくと、mvn packageの過程でそこにアクセスしてライブラリを取ってこれる。
  • これとは別に「ローカルリポジトリ」もある。mvn packageでjarファイルを作った後、mvn installmvn install:install-file でローカルリポジトリに登録できる。Windowsだと実際の場所は {ホームディレクトリ}/.m2/repository にインストールしたライブラリが並ぶ。

repo.spring.io

3-2 デスクトップアプリケーション開発

  • mvn archetype:generate -DarchetypeGroupId={グループID} -DarchetypeArtifactId={アーティファクトID} で細かく特定のテンプレートをもとにプロジェクトを作成できる。
  • 所定の指定をするとGUIアプリケーションでSwingの後に主流になったJavaFXのプロジェクトも生成できる。

openjfx.io

こういう例も載っているのがありがたいですね。とはいえ2021~現在、JavaGUIアプリを作る機会があるかというとだいぶなさそうな気も。

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を使ったビルドツール。JavaScalaでよく使われる。
  • 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がメインで、ここにプラグインの設定、リポジトリの設定、依存するライブラリなどを書いて実行。

gradle.org groovy-lang.org

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.gradletask 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などのライブラリを書いておく。
    • warプラグインがあると、gradle war でWARファイル作成。
    • jettyプラグインがあると、gradle jettyRun でJettyが起動してブラウザから簡単に動作確認できる。

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.echoant.mkdirのように書いていけばよい。
  • ant.importBuild {build.xmlの場所} と書くと、Antのビルドファイルbuild.xmlも呼べる。

ちょうど仕事でもちょっと触れていたので復習できてよい章でした。各種アプリケーションの作り方など、設定例も載っているので使う方には役に立つと思います。
 まずAntが生まれてビルドツールという考え方も含めて普及→欠点を直して改良してMaven誕生→さらに改良してGradle誕生...の流れなので、子孫のGradleから始祖にあたるAntの機能も使えるのは面白いですね。

ant.apache.org

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 で、MavenGradleと同様。
  • 直下の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 コマンドでブラウザから起動、プロジェクトの管理や起動ができる。

scala-ide.org

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メソッドが実行。

bazel.build

7-2 Bazelを使いこなす

  • BUILDファイルの中に記述するとMavenのセントラルリポジトリも使える。JUnitのテストも実行できる。

7-3 Bazelの基本的な機能

  • マクロ名.bzlというファイルでマクロが定義でき、BUILDファイルから呼べる。マクロ内からコマンド実行など各種可能。

まったく知らなかったのですがこういうツールもあるのか...という感じ。なんとなくLinuxの中で作りこんだシェルスクリプトの延長のような感じがします。 その後あまり話を聞かないですが、2020年にAodroidオープンソースプロジェクトのビルドツールとしてこのBazelが採用されていますね。

最後には本書の2017年時点でのビルドツールの今後の展望が記述されています。本書の予想によれば...

  • MavenJavaビルドツールの代名詞だが、XMLベースなのがネック。
  • Mavenの大きな功績であるセントラルリポジトリはずっと使われる。
  • Gradleはスクリプト言語で書けるのが便利で、今後主流になりそう。
  • SBTはJava/Scala言語のPlay Framework専用と思われがちで、それ以外のプロジェクトでも使われれば普及するかも。
  • Bazelは一般的な普及でなく、とにかく高速のビルドを求めるようなケースで使うようなもの。こうした自社開発向けツールがOSSで公開されるという動きは今後も続きそう。
  • 開発ツールが固定で提供するビルド手順より、自分たちで選択したビルドツールでビルドするやり方が多くなりそう。

大体2021年現在もこうなっているなあという感じです。

まとめ:ビルドツールが概観できる本

 SBTとBazelは使う機会がなさそうなので多くの場合はMavenとGradleの情報が主になるかと思いますが、復習にはちょうど良い本でした。2017年2月発売とちょい古いですが、プロジェクトの土台を支えるこうしたビルドツール周りは変化のスピードはあまり激しくなので、十分役立つ内容でした。
掌田津耶乃さんの本は超入門シリーズなどは時々誤植が多かったり内容が薄かったりすることもあるのですが、本書はボリューム380ページ、かなりしっかり書いてある印象です。まだまだ多いであろう歴史あるJavaプロジェクトや、Android開発に携わっている方にはちょうど良いのではないでしょうか。

f:id:iwasiman:20210813211130p:plain
Javaビルドツール入門 ビルドツールを学ぼう

関連書籍

EclipseではじめるJavaフレームワーク入門 第5版 Maven/Gradle対応』が2016年、同じく掌田津耶乃さんの本。総合的に扱った本ですがMavenとGradleの話も出ています。586ページと情報も詰まっていてけっこうおすすめです。

 当ブログにも以前に読んだ時の感想記事があります。完全に余談ですがこの記事、けっこう今でも検索からのアクセスがあります。やはりJava関係の情報は検索されることが多いのだなあと思ったりします。

iwasiman.hatenablog.com

Gradleについては2014年なのでだいぶ古いですが、『Gradle徹底入門 次世代ビルドツールによる自動化基盤の構築』という本が出ています。

ビルドツールを専門に扱った本というとやはりあまりないですね。Java開発を総合的に扱った本や各種情報の載ったムック、特定のフレームワークの解説本などに、中の作業の一部としてビルドツールの話も一緒に載っているような体裁が多いです。