【入門編】Mavenの「Reactor Build」を極める:特定のモジュールのみを高速に再ビルドする裏技 – ビルド・パッケージ管理ツール生産性向上バイブル

こんにちは!開発現場の最前線で、日々コードと格闘されている皆さん。

Javaによる大規模なエンタープライズ開発において、こんなストレスを抱えたことはありませんか?
「画面の文言を1文字変えただけなのに、なぜか全モジュールのビルドが走って数分待たされる……」
「依存関係が複雑なマルチモジュールプロジェクトで、どこを直したらどこを再ビルドすればいいのか分からない……」

もし、あなたが毎回のビルド待ち時間にコーヒーを淹れに行く習慣がついているなら、今日の話は劇的な福音になります。今回は、Mavenが裏側で持っている強力なエンジン「Reactor(リアクター)」の仕組みを紐解き、変更したモジュールだけを秒速で再ビルドするプロの裏技を伝授します。

これをマスターすれば、あなたの毎日のコーディングサイクルは嘘のように軽快になりますよ。さあ、一緒に「待たない開発環境」を手に入れましょう!

—

1. そもそも「Reactor(リアクター)」って何をしているのか?

Mavenのマルチモジュールプロジェクトをビルドするとき、ターミナルに流れるログをぼんやり眺めたことはありませんか?

[INFO] Scanning for projects…
[INFO] ————————————————————————
[INFO] Reactor Build Order:
[INFO]
[INFO] core-utils ………………………………….. SUCCESS [ 1.2 s]
[INFO] data-access …………………………………. SUCCESS [ 0.8 s]
[INFO] web-frontend ………………………………… SUCCESS [ 2.5 s]
[INFO] ————————————————————————
[INFO] BUILD SUCCESS

この `Reactor Build Order` という行こそが、Mavenの心臓部です。

MavenのReactorは、プロジェクト全体の `pom.xml` をスキャンし、すべてのモジュール間の依存関係(DAG:有向非巡回グラフ)をメモリ上に構築します。そして、「どのモジュールをどの順番でコンパイル・パッケージングすべきか」の実行計画を自動的に組み立てて実行しているのです。

なぜデフォルトの全ビルドは遅いのか?

何も指定せずにプロジェクトのルートディレクトリで `mvn clean install` を実行すると、Reactorは「プロジェクトに含まれるすべてのモジュール」を無条件で上から順にビルドします。

10個や20個のモジュールならまだしも、100を超えるマイクロサービスや巨大な業務システムでは、変更していないモジュールのテストやコンパイルまで毎回実行されるため、数分〜十数分の無駄な時間が失われます。ここにメスを入れるのが、今回紹介するCLIテクニックです。

—

2. 基礎知識:マルチモジュールプロジェクトの構造化

まずは、私たちがこれから操作する典型的なマルチモジュールプロジェクトの構造を確認しておきましょう。

my-enterprise-app/
├── pom.xml # 親POM(全モジュールを統括)
├── core-utils/ # ユーティリティモジュール(依存なし)
│ └── pom.xml
├── data-access/ # DBアクセスモジュール(core-utilsに依存)
│ └── pom.xml
└── web-frontend/ # Web層モジュール(data-accessに依存)
└── pom.xml

親POM(`my-enterprise-app/pom.xml`)の中身は、次のように子モジュールを束ねています。


4.0.0

com.example
my-enterprise-app
1.0.0-SNAPSHOT pom



core-utils
data-access
web-frontend

—

3. 現場で震えるほど役立つ!Reactorを意のままに操る3つのCLIオプション

ここからが本題です。MavenのReactorをハックし、ビルド時間を極限まで削るための3つの強力なオプションを解説します。

① `-pl` (または `–projects`) : 特定のモジュールだけを撃ち抜く

「`web-frontend` のコードだけを直したから、ここだけビルドしたい!」という時に使うのが `-pl` オプションです。

web-frontend モジュールだけをピンポイントでビルドする
mvn clean package -pl web-frontend

【注意点】
非常に高速になりますが、もし `web-frontend` が依存している `data-access` のコード側を最近変更しており、その成果物がローカルリポジトリ(`~/.m2/repository`)にまだインストールされていない場合、コンパイルエラーになります。「あれ、ビルド通らないぞ?」となったら、次のオプションの出番です。

—

② `-am` (または `–also-make`) : 依存している上流モジュールを自動で作る(神機能)

先ほどの `-pl` の弱点を完璧に補うのが `-am` です。これこそが、日々の開発で最も使うべき「神オプション」です。

web-frontend と、それが依存している上流モジュール(data-access, core-utils)も含めてビルドする
mvn clean package -pl web-frontend -am

内部で何が起きているか?
Reactorは依存関係のグラフを逆向きに辿り、`web-frontend` が必要とする下位のモジュール(`data-access` と `core-utils`)を自動的に検出し、「必要な最小限のセット」だけにビルド対象を絞り込みます。 全モジュールのビルドに比べて、体感スピードが数倍〜十数倍に跳ね上がります。

—

③ `-amd` (または `–also-make-dependents`) : 変更したモジュールに依存する下流モジュールも巻き込む

逆に、「共通基盤である `core-utils` の仕様をちょっと変えた。これに依存している `data-access` や `web-frontend` も含めて、影響範囲を全部テストしたい!」という時に使います。

core-utils と、それを利用しているすべての下流モジュールをビルドする
mvn clean package -pl core-utils -amd

これを使えば、影響範囲の調査漏れによる「あ、あっちのモジュールのビルドが壊れてた!」というCIでの赤信号を、手元のマシンの段階で事前に完全に防ぐことができます。

—

4. 実践:どれくらい速くなるのか体験してみよう

では、実際にこのコマンドを叩いたときの挙動をシミュレートしてみましょう。

例えば、`data-access` モジュール内のクラスを少し修正したとします。従来であればルートで `mvn clean install` を叩いて全モジュールのビルドを待つところですが、こう指示します。

data-access と、それに依存する web-frontend のみを賢く選別してビルド
$ mvn test -pl data-access,web-frontend -am

[INFO] Scanning for projects…
[INFO] ————————————————————————
[INFO] Reactor Build Order:
[INFO]
[INFO] data-access …………………………………. SUCCESS [ 1.1 s]
[INFO] web-frontend ………………………………… SUCCESS [ 1.8 s]
[INFO]
[INFO] Total time: 3.3 s
[INFO] ————————————————————————
[INFO] BUILD SUCCESS

見てください! `core-utils` のビルドが完全にスキップされ、わずか3秒足らずでビルドが完了しました。これが大規模プロジェクトになると、数分単位の時間の節約になります。

—

5. さらに開発を加速させるためのプロの知見

最後に、このReactorの仕組みをさらに実務で活かすためのアドバイスをいくつか送ります。

1. IDE(IntelliJ IDEAなど)のビルドとの使い分け
IntelliJ IDEAには優秀なインクリメンタルビルド機能がありますが、複雑なAnnotation Processor(LombokやMapStructなど)が絡むマルチモジュール環境では、時にビルドキャッシュがおかしくなり、原因不明のコンパイルエラーに悩まされることがあります。そんな時、信頼できるCLIで `mvn clean compile -pl -am` をさっと流せる引き出しを持っていると、トラブルシューティングのスピードが圧倒的になります。

2. エイリアス(Shell Alias)の活用
よく使うコマンドは、`.zshrc` や `.bashrc` に登録しておくとさらに快適です。

# 例: 良く使う「指定モジュール+依存モジュールビルド」のショートカット
alias mvnc=”mvn clean compile -am -pl”
# 実行時: mvnc web-frontend

まとめ

MavenのReactor Buildと `-pl`, `-am`, `-amd` オプションの組み合わせ、いかがでしたでしょうか?

ツールが裏側でどう動き、どうやって依存関係を解決しているのかを理解していれば、単なるおまじないのコマンドから、自分の意のままに操る強力な武器へと変わります。

「無駄な待ち時間をゼロにし、フロー状態を保ってコードを書く」。
一流の開発環境は、こうした細かなCLIのチューニングの積み重ねによって作られます。ぜひ、明日からの開発で試してみてくださいね。あなたの開発ライフがより快適になることを応援しています!

タイトルとURLをコピーしました