Payara Microの実行可能JAR(Uber JAR)がとても簡単な件
先日、Payara 4.1.1.162がリリースされました!
その組み込みサーバー版であるPayara Micro 4.1.1.162には、「Uber JAR」というSpring BootやWildFly Swarmのような単体で実行可能なJARを作る機能が追加されました。
Payara 4.1.1.162 がリリースされました - GlassFish Japan
従来のPayara Microでは、一旦アプリケーションを普通にWARにして、Payara Micro起動→WARをデプロイする必要がありました。
今回の新機能により、本当に単体で実行可能なJARを作れるように
手順は蓮沼さんのブログに書かれてある通りなのですが、自分でもやってみてあまりに簡単で感動したので、このブログにも書くことにしました。
手順
普通にWebアプリケーションを作る
本当に普通に作ってください。pom.xmlのpackageは「war」です。
組み込みじゃない据え置きのGlassFish/Payaraにデプロイするアプリケーションと全く同じ形で作ってください。
下記は、今月のJJUG CCC 2016 Springで紹介する予定の、MVC 1.0のサンプルアプリケーションです。
アプリケーション側は全く変えることなく、据え置きサーバー・実行可能JARの両方に対応できます。
jjug-action-based-mvc/jjug-mvc10 at master · MasatoshiTada/jjug-action-based-mvc · GitHub
そして、MavenでWARファイルにビルドします。
cd jug-mvc10 mvn clean package
jjug-mvc10/targetフォルダにjjug-mvc10-1.0-SNAPSHOT.warが作成されます。
実行可能JARを作成する
上記のWARファイルを元に、Payara Microで実行可能JARを作ります。
あらかじめ、Payara Micro 4.1.1.162のJARは下記からダウンロードし、適当なフォルダに保存してください。
Payara Server & Payara Micro - Downloads
そして、次のコマンドを実行します。
java -jar ~/Java/ap-server/payara-micro-4.1.1.162.jar\ --deploy target/jjug-mvc10-1.0-SNAPSHOT.war\ --outputUberJar target/jjug-mvc10.jar
--outputUberJar
というオプションがポイントです。
こうすると、targetフォルダにjjug-mvc10.jarというJARファイルが作成されます。これが実行可能JARです。
ちなみに、このオプションがない場合、これまでのPayara Microと同じ挙動になります。
-jar の後は先ほどダウンロードしたPayara MicroのJARファイルのパス、--deployの後はWARファイルのパスです。
ちなみに、jar tf target/jjug-mvc10.jar
とすると、実行可能JARの中身を確認することができます。
とても長いので全部は載せませんが、Payara Microの中身が解凍・再パッケージされていることが確認できます。
META-INF/services/javax.enterprise.inject.spi.CDIProvider META-INF/services/org.glassfish.tyrus.core.ComponentProvider META-INF/services/javax.management.remote.JMXConnectorProvider (中略) META-INF/ META-INF/MANIFEST.MF __cp_jdbc_ra.rar __dm_jdbc_ra.rar __ds_jdbc_ra.rar __xa_jdbc_ra.rar META-INF/configuration/ META-INF/hk2-locator/ META-INF/maven/ META-INF/maven/org.glassfish.main.concurrent/ META-INF/maven/org.glassfish.main.concurrent/concurrent-connector/ org/ org/glassfish/ org/glassfish/concurrent/ org/glassfish/concurrent/config/ META-INF/configuration/context-service-conf.xml META-INF/configuration/managed-executor-service-conf.xml META-INF/configuration/managed-scheduled-executor-service-conf.xml META-INF/configuration/managed-thread-factory-conf.xml META-INF/maven/org.glassfish.main.concurrent/concurrent-connector/pom.properties META-INF/maven/org.glassfish.main.concurrent/concurrent-connector/pom.xml org/glassfish/concurrent/config/ConcurrencyResource.class org/glassfish/concurrent/config/ContextService$ContextServiceConfigActivator.class org/glassfish/concurrent/config/ContextService$Duck.class org/glassfish/concurrent/config/ContextService.class org/glassfish/concurrent/config/ContextServiceInjector.class org/glassfish/concurrent/config/LocalStrings.properties (以下略)
一番最後の方に、自分で作ったWARファイルが見えます。
... META-INF/deploy/ META-INF/deploy/jjug-jersey-mvc-1.0-SNAPSHOT.war META-INF/deploy/payaramicro.properties
META-INF/deployに直接WARファイルが入ってるんですね!
実行する
java -jar target/jjug-mvc10.jar
これで実行できます。
後はブラウザで開いてださい。
http://localhost:8080/jjug-mvc10-1.0-SNAPSHOT/
ちなみに、僕はここまでの処理は1つのシェルスクリプトにまとめて、実行する時はそれを叩くだけにしています。
jjug-action-based-mvc/build-jar.sh at master · MasatoshiTada/jjug-action-based-mvc · GitHub
まとめ
WARに固めてから実行可能JARにする、というのが少し違和感があるかもしれませんが、アプリケーション側に何も変更なく実行可能JARが出来るというのは非常に面白いと感じました。
ぜひご自分でも試してみてください!