はじめに
本記事はMDC Advent Calendar 2022の9日目の記事です。
SpringBootでのアプリケーション開発ではビルド後に java -jarで簡単にアプリ起動することができますが、Jakarta EE(JavaEE)ではそのようには出来ません。
アプリケーションサーバーの準備不要で、java -jar実行でまるっと起動させる仕組みをUberJarと呼びます。前にはWildflyでUberJarする方法を取り上げました。
今回は先日リリースされたJakarta EE10記念として、Jakarta EE10に対応したアプリケーションサーバーでのUberJar化の方法を紹介したいと思います。
各種アプリケーションサーバーで違いをみながら説明するのが面白いと思ったのですが、下記始めるとかなり長くなってしまったので、シリーズ化します。初回はOpen Libertyです。後日、Payara、WildFly
Open Liberty の場合
まずMicroProfileで動かす
最初に紹介するのはOpen Liberty です。こちらは、IBM社のWebSphereから進化を遂げ、OSSとして公開されているアプリケーションサーバーです。MicroProfileにもJakarta EEにも対応しています。
MicroProfileについては過去記事で紹介しています。
その時と同様、MicroProfile Starterを使ってベースとなるアプリケーションを生成します。
私の環境は以下でした。
\$ mvn -v
Apache Maven 3.3.9 (bb52d8502b132ec0a5a3f4c09453c07478323dc5; 2015-11-11T01:41:47+09:00)
Maven home: /Users/xxxx/apache-maven-3.3.9
Java version: 11.0.7, vendor: AdoptOpenJDK
Java home: /Users/hiromitakahashi/.sdkman/candidates/java/11.0.7.hs-adpt
Default locale: ja_JP, platform encoding: UTF-8
OS name: "mac os x", version: "10.16", arch: "x86_64", family: "mac"
ソースコードの編集を行う前に、
\$ mvn package
[INFO] Scanning for projects...
[INFO]
[INFO] ------------------------------------------------------------------------
[INFO] Building jeedemo 1.0-SNAPSHOT
[INFO] ------------------------------------------------------------------------
[INFO]
・
・
〜省略〜
・
・
[INFO] サーバー jeedemo をパッケージ中です。
[INFO] サーバー jeedemo のパッケージが /Users/xxxx/Downloads/jeedemo/target/jeedemo.jar で完了しました。
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------
[INFO] Total time: 01:29 min
[INFO] Finished at: 2022-12-09T22:50:08+09:00
[INFO] Final Memory: 19M/67M
[INFO] ------------------------------------------------------------------------
とビルドしてUberJarが生成されることを確認します。初回は各種ライブラリダウンロードでしばらく時間がかかります。
その後、生成されたjarを使ってアプリ起動します。
java -jar target/jeedemo.jar
ファイルを /Users/xxxx/wlpExtract/jeedemo_589807133938665/wlp に抽出しています。
・
・
〜省略〜
・
・
[監査 ] CWWKT0016I: Web アプリケーションが使用可能です (default_host): http://localhost:9080/
[監査 ] CWWKZ0001I: アプリケーション jeedemo が 9.823 秒で開始しました。
[監査 ] CWWKF0012I: サーバーは次のフィーチャーをインストールしました。[appAuthentication-3.0, appAuthorization-2.1, appClientSupport-2.0, appSecurity-5.0, batch-2.1, beaoncurrent-3.0, connectors-2.1, distributedMap-1.0, enterpriseBeans-4.0, enterpriseBeansHome-4.0, enterpriseBeansLite-4.0, enterpriseBeansPersistentTimer-4.0, enterpriseBeansRemote-4.0, expressionLanguage-5.0, faces-4.0, jakartaee-10.0, jdbc-4.2, jndi-1.0, json-1.0, jsonb-3.0, jsonp-2.1, mail-2.1, managedBeans-2.0, mdb-4.0, messaging-3.1, messagingClient-3.0, messagingSecurity-3.0, messagingServer-3.0, pages-3.1, persistence-3.1, persistenceContainer-3.1, restConnector-2.0, restfulWS-3.1, restfulWSClient-3.1, servlet-6.0, ssl-1.0, transportSecurity-1.0, webProfile-10.0, websocket-2.1, xmlBinding-4.0, xmlWS-4.0]。
[監査 ] CWWKF0011I: jeedemo サーバーは、Smarter Planet に対応する準備ができました。jeedemo サーバーは 44.698 秒で始動しました。
その後、ログにも出ているhttp://localhost:9080/へブラウザでアクセスすることで正常稼働を確認することができます。
画面が出ていることで正常動作を確認しました。
Jakarta EE10対応する
先ほどのソースコードをベースにJakartaEE10対応していきます。
以下の記事を参考にしながら進めます。12/6の記事のようですので、ホットな内容ですね。
pom.xmlの修正
- (10行目)Open Libertyのmavenプラグインのバージョンを変更します。下げるという行為は謎ですが、トラブル防止のため上記リンク先の通りにします
- (18行目)jakarta-api のバージョンの設定を追加します
- (20行目以降)依存ライブラリにJakarta EEのライブラリを追加します。動作させる時にはOpen Libertyから提供されますのでscopeはprovidedです
- (27行目以降)依存ライブラリからmicroprofileを抜きます。純粋なJakarta EEでの開発をしたいので、いつの間にかMicroProfileの機能を使っていました、、ということを塞ぐためです
server.xmlの修正
このファイルはOpen Liberty独自のファイルです。サーバーのどの機能を使うのかを設定します。
Jakarta EEやMicroProfileは多数の機能仕様群で構成されています。全部の機能を具備するように準備すると、Jarファイルのサイズが大きくなってしまったり、多くのものをメモリに読み込み初期化するため起動時間が長くなってしまったりします。
そのため利用する機能を最低限で指定することにより軽くするというコンセプトの設定ファイルとなっています。
- (10行目)microprofileの設定となっているので、Jakarta EE10の指定に変更します
修正は以上です。
動作確認する
初回と同様に、動作確認します。mvn package
でビルド、java -jar target/jeedemo.jar
でアプリ起動です。
依存ライブラリに変更が入っておりますので、これも初回は各種ダウンロードに時間がかかります。
\$ mvn package
[INFO] Scanning for projects...
[INFO]
[INFO] ------------------------------------------------------------------------
[INFO] Building jeedemo 1.0-SNAPSHOT
[INFO] ------------------------------------------------------------------------
[INFO]
・
・
〜省略〜
・
・
[INFO] サーバー jeedemo のパッケージが /Users/hiromitakahashi/Downloads/jeedemo/target/jeedemo.jar で完了しました。
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------
[INFO] Total time: 01:29 min
[INFO] Finished at: 2022-12-09T22:50:08+09:00
[INFO] Final Memory: 19M/67M
[INFO] ------------------------------------------------------------------------
とビルドしてUberJarが生成されることを確認します。初回は各種ライブラリダウンロードでしばらく時間がかかります。1分半弱、結構かかりましたね。。。
その後、生成されたjarを使ってアプリ起動します。
java -jar target/jeedemo.jar
ファイルを /Users/xxxx/wlpExtract/jeedemo_589807133938665/wlp に抽出しています。
すべての製品ファイルを正常に抽出しました。
OpenJDK 64-Bit Server VM バージョン 11.0.7+10 (ja_JP) で、jeedemo (Open Liberty 22.0.0.13-beta/wlp-1.0.71.cl221220221107-1900) を起動しています
CWWKE0953W: このバージョンの Open Liberty は、サポートされない早期リリース・バージョンです。
[監査 ] CWWKE0001I: サーバー jeedemo が起動されました。
・
・
〜省略〜
・
・
[監査 ] CWWKT0016I: Web アプリケーションが使用可能です (default_host): http://localhost:9080/
[監査 ] CWWKZ0001I: アプリケーション jeedemo が 11.324 秒で開始しました。
[監査 ] CWWKF0012I: サーバーは次のフィーチャーをインストールしました。[appAuthentication-3.0, appAuthorization-2.1, appClientSupport-2.0, appSecurity-5.0, batch-2.1, beaoncurrent-3.0, connectors-2.1, distributedMap-1.0, enterpriseBeans-4.0, enterpriseBeansHome-4.0, enterpriseBeansLite-4.0, enterpriseBeansPersistentTimer-4.0, enterpriseBeansRemote-4.0, expressionLanguage-5.0, faces-4.0, jakartaee-10.0, jdbc-4.2, jndi-1.0, json-1.0, jsonb-3.0, jsonp-2.1, mail-2.1, managedBeans-2.0, mdb-4.0, messaging-3.1, messagingClient-3.0, messagingSecurity-3.0, messagingServer-3.0, pages-3.1, persistence-3.1, persistenceContainer-3.1, restConnector-2.0, restfulWS-3.1, restfulWSClient-3.1, servlet-6.0, ssl-1.0, transportSecurity-1.0, webProfile-10.0, websocket-2.1, xmlBinding-4.0, xmlWS-4.0]。
[監査 ] CWWKF0011I: jeedemo サーバーは、Smarter Planet に対応する準備ができました。jeedemo サーバーは 59.230 秒で始動しました。
起動には1分弱かかりました。MicroProfile時よりは少しかかりましたが、通常のアプリケーションサーバーよりは短いかと思います。
画面も修正していないので、同じです。。JakartaEEなどの表示に変えればよかったですね。。
まとめ
アプリケーションサーバーの事前準備(インストール&起動)不要で、いきなりJava実行でアプリケーションサーバーの機能を使って動作させることが出来る、UberJarでの開発スタイルをJakarta EE10でも出来るという点を紹介しました。
今回紹介したOpen Libertyについてはまだベータ版でしたが、今後紹介するPayaraなどは正式版になっているので次回投稿も楽しみにしていてください!
ご参考
使ったソースコードは以下です。
JavaとMavenの環境が整っていれば、clone
して、mvn package
して、java -jar target/jeedemo.jar
で試すことが出来ると思います。