Payara Micro 5によるUber JARの作成
Originally published on 18 May 2021
Last updated on 09 Jun 2021

Payara Microでは、Webアプリケーションを自己完結型で簡単に実行することができます。2016年5月のPayara Serverリリースからは、WARファイルの内容とPayara Microを構成するクラスやリソースを束ねる “Uber JAR” を作成する簡単な方法があります。
この “Uber” Jarは、Dockerコンテナ内でアプリケーションを実行するための最良の方法ではないことに注意してください。アプリケーションに小さなコード変更を加えるたびに、バイナリ全体のアップデートが必要になるためです。より良い方法は、Payara Microインスタンスを起動して、インストールが必要なアプリケーションを指定することです。詳細については Payara Micro Docker Image documentation をご覧ください。
(最終更新日 2021/04/06)
実装
まず、従来の方法(例えばMavenなど)でWebアプリケーションを生成します。次に、このアプリケーションを --outputUberJar オプションを有効にして Payara Micro へデプロイし、結果のJARファイルを生成します。
java -jar payara-micro-5.2021.1.jar --deploy test-app.war --outputUberJar test-app.jar
以下のような出力が得られます。
Apr 06, 2021 9:09:47 AM fish.payara.micro.impl.UberJarCreator buildUberJar
INFO: Building Uber Jar... test-app.jar
Apr 06, 2021 9:09:48 AM fish.payara.micro.impl.UberJarCreator buildUberJar
INFO: Built Uber Jar basic-servlet.jar in 450 (ms)
そして最後に、このUber jarを作成すると、簡単なJavaコマンドでアプリケーションを実行することができます。
java -jar test-app.jar
これにより、Payara Microのインスタンスが起動し、元のWebアプリケーションをデプロイします。
では、このアプリケーションが使用するHTTPポート (デフォルトでは8080) を変更したい場合はどうすればよいのでしょうか。あるいは、クラスタリング機能を無効することはできるのでしょうか。Uber jarの生成には、互換性のあるPayara Microの設定オプションをすべて渡すことができ、アプリケーションの実行時には、これらのオプションがサーバー・インスタンスの設定として使用されます。
java -jar payara-micro-5.2021.1.jar --deploy test-app.war --outputUberJar test-app.jar --port 9898 --noCluster
しかし、アプリケーション・インスタンスのHTTPポートやクラスタの構成を実行時に設定したい場合はどうすればよいでしょうか。問題はありません。アプリケーションのJARを実行する際に、これらのプロパティを引数として渡すことができます。
java -jar test-app.jar --port 10080 --noCluster
また、--deployオプションを複数回使用することで、より多くのアプリケーションをパッケージ化することができるため、このUber JARにバンドルされるアプリケーションは1つに限定されません。
java -jar payara-micro-5.2021.1.jar --deploy test-app-1.war --deploy test-app-2.war --outputUberJar test-app.jar
そして、このJARでパッケージ化されたアプリケーションを起動すると、サーバーはいくつのアプリケーションがデプロイされたかを知らせてくれます。
[2021-04-06T09:56:53.923+0000] [] [INFO] [] [PayaraMicro] [tid: _ThreadID=1 _ThreadName=main] [timeMillis: 1617693676410] [levelValue: 800] Deployed 2 archive(s)
これにより、アプリケーションの自己完結型環境を作成し、簡単にデプロイすることができます。Payara Microはサイズが小さいので、出来上がったJARをパッケージ化して移動することは、費用対効果が高く、時間も節約できます。
Mavenによる方法
通常、自己完結型のアプリケーションを作成する場合、最も一般的なシナリオの1つは、Mavenを使用して、shadeプラグインを使用してUber JARを作成することです。Payara Micro Mavenプラグインを使用すると、この作業は非常に簡単になり、Mavenの設定で必要なすべてのコマンドライン・オプションを指定することができます。以下の例では、Maven ライフサイクルの package フェーズで Uber JAR ファイルを生成します。
<groupId>fish.payara.maven.plugins</groupId>
<artifactId>payara-micro-maven-plugin</artifactId>
<version>1.3.0</version>
<configuration>
<payaraVersion>5.2021.1</payaraVersion>
<deployWar>true</deployWar>
<commandLineOptions>
<option>
<key>--autoBindHttp</key>
</option>
</commandLineOptions>
<contextRoot>/</contextRoot>
</configuration>
<executions>
<execution>
<goals>
<goal>bundle</goal>
</goals>
</execution>
</executions>
</plugin>
このプラグイン宣言により、Payara Micro Uber JAR作成を実行するbundle ゴールの実行を設定します。複数のコマンドライン・オプションやコンタクト・ルートなどの設定パラメータを指定可能です。すべての設定パラメータは、プラグインのドキュメントに記載されています。
Uber JARのDocker上での使用
開発者がPayara Micro Uber JARをベースに Docker コンテナを作成したい場合にはどうすれば良いのでしょうか。このシナリオには複数の選択肢がありますが、最も簡単なものは、JavaベースのDockerイメージを使ってUber JARを取得して実行することです。例えば、以下のようなDockerfileを構成します。
FROM azul/zulu-openjdk-alpine:8
ENV APP_LOCATION ./test-app.jar
ENV APP_NAME application.jar
ADD $APP_LOCATION $APP_NAME
RUN chmod +x $APP_NAME
EXPOSE 8080
ENTRYPOINT java -jar $APP_NAME
And build a new image:
docker build -t payara-uber-jar .
この例では、azul:zulu-openjdk-alpine:8をベース・イメージとして使用していることに注目してください。これは、Alpine Linuxオペレーティング・システムをベースにしたZulu Java 8イメージで、非常に小さなサイズのディストリビューションです (これは、公式のPayara Micro Dockerイメージで使用しているベース・イメージと同じものです)。このコンテナをできるだけ軽量にしたいために使用しています。ここでは、DockerfileのADD命令を使って、Uber JARを外部ソース (ここではDockerfileと同じディレクトリにあるuberjar) からダウンロードし、ダウンロードしたUber JARでテストアプリケーションを実行するように、このコンテナのエンドポイントを設定しています。
このコンテナを起動するには、以下のコマンドを実行するだけです。
docker run -d -p 8080:8080 --name uber-jar payara-uber-jar
ただし、Uber JARをDockerイメージで使用することは効率的ではなく、バッド・プラクティスであることに注意してください。コードが変更されるたびに、Uber JARをビルドし、新しいDockerイメージを作成する必要があります。ここでは、アプリケーションの変更だけでなく、変更されていないPayara Microのコードを含むより大きなJARファイルがピックアップされます。
より良い方法は、Payara Microインスタンスを起動して、インストールが必要なアプリケーションを指定することです。詳細については、Payara Micro Docker Image documentationのドキュメントを参照してください。
結論
Payara Microは、アプリケーション開発者に新たな可能性をもたらします。マイクロサービスやDevOpsなどの複雑なコンセプトの出現により、サーバーとアプリケーションを同時に実行できる自己完結型のJARを作成する能力は、多くの開発者が必要としています。この方法を用いると、Payara Serverは多くの継続的インテグレーションのワークフローと簡単に統合できるため、Java開発者は安心して取り組むことができます。
Related Posts
What is Platform Engineering - An Overview without Buzzwords
Published on 12 May 2025
by Chiara Civardi
0 Comments
Maven 4: Streamlining Enterprise Java Development with Jakarta EE, Spring Boot and Quarkus
Published on 08 May 2025
by Luqman Saeed
0 Comments
After two decades as Java's dominant build tool (no offense to Gradle), Maven is undergoing its most significant evolution. While the official Maven documentation outlines the technical changes in Maven 4, this blog post focuses specifically on ...