Maven Shade PluginでUber-JARを作成!Jakarta EE初心者向け完全ガイド
生徒
「Jakarta EEのアプリケーションをひとつのJARにまとめる方法ってありますか?」
先生
「ありますよ。Maven Shade Pluginを使えば、全ての依存ライブラリをひとつのJARにまとめた“Uber-JAR”を作ることができます。」
生徒
「それを使うと、Jakarta EEのWebアプリケーションも簡単に実行できるんですか?」
先生
「そのとおり。依存関係の競合解決や、実行可能JARの作成も可能です。それでは、使い方を詳しく見ていきましょう。」
1. Maven Shade Pluginとは?
Maven Shade Pluginは、Apache Mavenで使用できる公式プラグインの一つで、複数のJARファイル(依存ライブラリなど)を一つにまとめた実行可能なUber-JARを作成するために使われます。
Jakarta EEのようなJava EE仕様に準拠したアプリケーションでも、自己完結型のJARを作ることで、実行環境への依存を減らし、移植性の高いアプリケーションに仕上げることができます。
2. Uber-JARのメリットと利用シーン
Uber-JAR(Fat JAR)は、アプリケーション本体と全ての依存ライブラリを含んだJARファイルです。これにより、次のようなメリットがあります。
- Jakarta EEの依存関係を気にせずに単体実行できる
- Java環境さえあればどこでも動く
- Dockerなどと組み合わせてデプロイしやすい
- シンプルな
java -jarコマンドで実行可能
特に、軽量なJakarta EEアプリケーションや、マイクロサービス形式での展開に最適です。
3. Maven Shade Pluginの導入方法
まずは、Jakarta EEプロジェクトのpom.xmlにMaven Shade Pluginを追加します。以下のように設定することで、パッケージ時にUber-JARを生成できます。
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-shade-plugin</artifactId>
<version>3.2.4</version>
<executions>
<execution>
<phase>package</phase>
<goals>
<goal>shade</goal>
</goals>
<configuration>
<createDependencyReducedPom>false</createDependencyReducedPom>
<transformers>
<transformer implementation="org.apache.maven.plugins.shade.resource.ManifestResourceTransformer">
<mainClass>com.example.Main</mainClass>
</transformer>
</transformers>
</configuration>
</execution>
</executions>
</plugin>
</plugins>
</build>
<mainClass>には、Jakarta EEアプリケーションのエントリーポイントを指定しましょう。
4. Jakarta EEとUber-JARの相性
Jakarta EEでは本来、WARやEARの形式でアプリケーションをデプロイしますが、Payara MicroやWildFly Bootable JARのように、自己完結型の実行環境を持つ軽量サーバーを使えば、Uber-JAR化の恩恵を受けられます。
Shade Pluginを使って依存JARをまとめておけば、Jakarta EE用のアプリケーションサーバーに対する事前構成を気にせず、素早く実行環境を構築できます。
5. Uber-JARのビルドと実行手順
Uber-JARの作成はとても簡単で、以下のコマンド一つで行えます。
mvn clean package
すると、targetディレクトリにxxx-shaded.jarのようなファイルが生成されます。
実行は以下のようにシンプルです。
java -jar target/myapp-shaded.jar
これだけで、Jakarta EEの実行環境込みのアプリケーションがすぐ起動します。
6. 複数ライブラリの競合に注意
Uber-JAR化では、複数のライブラリに同一のリソースファイルやクラスが存在することで、依存関係の衝突が起こることがあります。
Maven Shade Pluginでは、そのような衝突を解消するためにrelocationsを使うことができます。例えば、ライブラリのパッケージ名を変更して衝突を回避できます。
<relocations>
<relocation>
<pattern>com.google.common</pattern>
<shadedPattern>shaded.com.google.common</shadedPattern>
</relocation>
</relocations>
これにより、Jakarta EEプロジェクトでも安全に外部ライブラリを含めたUber-JARを作成できます。
7. Maven Shade Pluginのよくある設定例
Jakarta EEでの使用例として、Payara Microと組み合わせる場合の設定も紹介します。
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-shade-plugin</artifactId>
<version>3.2.4</version>
<executions>
<execution>
<phase>package</phase>
<goals>
<goal>shade</goal>
</goals>
<configuration>
<artifactSet>
<includes>
<include>fish.payara.micro:payara-micro</include>
</includes>
</artifactSet>
<transformers>
<transformer implementation="org.apache.maven.plugins.shade.resource.ManifestResourceTransformer">
<mainClass>fish.payara.micro.PayaraMicro</mainClass>
</transformer>
</transformers>
</configuration>
</execution>
</executions>
</plugin>
このように、Payara Microを含めた自己実行可能なJakarta EEアプリケーションを構築できます。
8. Maven Shade PluginとJakarta EEの今後
近年のクラウドネイティブな流れでは、WARやEARよりも、軽量でポータブルなUber-JARのニーズが増しています。特にJakarta EEを使ったマイクロサービス開発では、Maven Shade Pluginを活用することで、コンテナ対応やCI/CDの自動化にも柔軟に対応できます。
Jakarta EEアプリケーションのビルド自動化や、ローカル実行テスト環境構築にも大きく貢献してくれるツールです。