SpringBoot 4.1講座 本番デプロイの基本!「uber JAR (fat JAR)」の仕組みと作り方を完全解説
開発環境(IDE)で動いていたアプリケーションを、いざ本番環境(クラウドやオンプレミスサーバー)へデプロイしようとしたとき、「 Tomcat などの Web サーバーをインストールして、依存ライブラリを集めて…」 といった複雑な手順に頭を悩ませたことはありませんか?
Spring Boot 4 では、コマンド1つでアプリケーションコード・依存ライブラリ・組み込み Web サーバー(Tomcat 11)をすべて1つのファイルにバンドルした「uber JAR(ウーバー・ジャー)」 を作成できます。
今回は、この uber JAR の概念と仕組み、そしてビルド方法をわかりやすく解説します!
1. uber JAR (fat JAR) とは?
uber JAR(または fat JAR)とは、以下をすべて1つの実行可能ファイル(.jar)にまとめたパッケージ構造のことです。
自分で書いたアプリケーションコード
サードパーティ製ライブラリ(Spring Framework, PostgreSQL Driver 等の .jar)
組み込み Web サーバー(Spring Boot 4 では Tomcat 11 / Jakarta EE 11 がデフォルト)
アプリケーションを起動するための Spring Boot クラスローダー
これがあるおかげで、Java(JDK/JRE)さえインストールされているサーバーであれば、外部の Web サーバー(Tomcat や Jetty 等)を別途セットアップすることなく、コマンド1つでアプリケーションを即座に起動できます。
2. uber JAR のビルド方法
ビルドは非常に簡単です。プロジェクトのルートディレクトリで以下の Maven コマンドを実行するだけです。
Bash
# macOS / Linux / POSIX シェルの場合
./mvnw clean package
# Windows (コマンドプロンプト) の場合
./mvnw.cmd clean package
コマンドの内訳
clean: 過去のビルド成果物(target ディレクトリ)を削除し、古いファイルが残るのを防ぎます。
package: アプリケーションのコンパイル、テストの実行、パッケージングまでの一連のフェーズを順番に呼び出します。
ビルドが完了すると、target/ ディレクトリ配下に 〜.jar ファイルが生成されます。
3. なぜコマンド一発で動くのか?(裏側の仕組み)
Spring Initializr(start.spring.io)でプロジェクトを作成すると、pom.xml に自動的に spring-boot-maven-plugin が組み込まれます。
XML
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
このプラグインが mvn package の裏側で以下の7つのステップを自動実行してくれます。
通常の Maven パッケージ処理で作成された JAR を取得する
元の JAR をバックアップ用にリネームして退避する(例: ch7-0.0.1-SNAPSHOT.jar.original)
新しい実行可能 JAR ファイルを作成する
ネストされた(JARの中にある)JARを読み込める Spring Boot 専用のクラスローダー を組み込む
アプリケーションコードを BOOT-INF/classes 配下に配置する
外部ライブラリ(依存関係)を解凍せずそのまま BOOT-INF/lib 配下に放り込む
コンテナ化や高速化に使うレイヤー情報(classpath.idx, layers.idx)を追加する
4. 実行してみよう!
作成された JAR ファイルは、以下の java -jar コマンドで簡単に実行できます。
Bash
java -jar target/ch7-0.0.1-SNAPSHOT.jar
実行すると、慣れ親しんだ Spring Boot のアスキーアートが表示され、組み込み Tomcat 11 が起動してリクエストを受け付ける準備が整います!
💡 補足:他のバンドル手法(Maven Shade Plugin等)との決定的な違い
実は「すべてのライブラリを1つのJARにまとめる」手法自体は昔から存在し、Maven Shade Plugin などを使った「Shaded JAR」という方式がありました。
しかし、Shaded JAR は依存するサードパーティ製ライブラリをすべて一旦解凍し、中身を混ぜ合わせて再圧縮するという暴れ技を行っていました。これには以下のような重大なリスクがあります。
設定ファイルや非クラスファイルが正しく配置されずバグの原因になる
ライブラリのライセンス条項に抵触する恐れがある
元の配布形態と変わってしまうため、ライブラリ作者へのバグ報告やサポートが受けられなくなる
Spring Boot の uber JAR は、サードパーティ製 JAR を一切解凍せず、そのまま JAR の中に保持します。 専用のクラスローダーが内包された JAR をそのまま読み込むため、安全で信頼性の高いデプロイが可能になっています。
5. まとめ
uber JAR は、コード・依存ライブラリ・Web サーバーを1つにまとめた単一実行ファイル。
./mvnw clean package だけで簡単に作成可能。
java -jar コマンド1つでどんな環境でも動くため、クラウドや CI/CD パイプラインとの相性が抜群!
次回は、 「Docker コンテナへのビルド(Baking a Docker container)」 について解説します!
ここから先は
¥ 100
この記事が気に入ったらチップで応援してみませんか?
