Java

QuarkusでUber Jarを生成し、コマンドラインからHerokuにデプロイする

QuarkusでUber Jar(依存を全て含む実行可能Jarファイル)をビルドするには
application.properties内に以下のエントリを置いておく。

quarkus.package.type=uber-jar

ファイル名は”[artifactId]-[version]-runner.jar”になる。例えば以下のpom.xmlのような設定だと”frontend-1.0-SNAPSHOT-runner.jar”が生成される。

<artifactId>frontend</artifactId>
<version>1.0-SNAPSHOT</version>
java -jar target/frontend-1.0-SNAPSHOT-runner.jar

このjarファイルは@QuarkusMainアノテーションの付いたクラスを発見してMANIFEST.MFのMain-Classエントリも記載してくれているので、

% java -jar target/frontend-1.0-SNAPSHOT-runner.jar

で実行可能。@QuarkusMainの前に何か処理をしたい場合はquarkus.package.main-classでメインクラスを指定することも可能。

バージョン名などを付けたくない場合は以下のように /build/finalName で指定すればsamuraism-frontend-runner.jarという名前になる。

…
</dependencies>
<build>
    <finalName>samuraism-frontend</finalName>
    <plugins>
…

“-runner”が気に食わなければapplication.propertiesで以下のようにquarkus.package.runner-suffixで指定できる(空にはできない)。

quarkus.package.runner-suffix=-launcher

Quarkusはデフォルトでポート8080でリスンするが、Herokuにデプロイする場合は環境変数$PORTで指定するポートでリスンする必要がある。@QuarkusMainでアノテートしたメインクラスで環境変数を読み取ってシステムプロパティquarkus.http.portにセットしても良いが、application.propertiesに以下のように書いておくだけで良い。

quarkus.http.port=${PORT:8080}

これは環境変数$PORTから読み取った値をquarkus.http.portにセット、環境変数が設定されていない場合はデフォルト値として8080を渡すという意味で、MicroprofileのProperty Expressionの仕様に基づく書き方。

コマンドラインからUber JarをデプロイするにはHeoku CLIにjavaプラグインをインストールして、deploy:jarコマンドでデプロイする。JDKバージョンは–jdkオプションで指定できる(指定の無い場合はJava 8)

以下は “samuraism-frontend-launchar.jar”を、Java 11で、samuraism-stagingアプリにデプロイする場合。

% heroku plugins:install java
% heroku deploy:jar samuraism-frontend-launcher.jar --jdk 11 --app samuraism-staging

親ディレクトリからtarget/samuraism-frontend-launcher.jarと相対パスで指定した場合は正常にデプロイできなかった。(今日たまたま調子が悪かっただけかも)

 

デプロイやその後の様子を見たければ logs -tailコマンド:

% heroku logs -tail --app samuraism-staging

eclipse/microprofile-config MicroProfile Configuration Feature

Heroku Dev Center  | Deploying Executable JAR Files – Using the Heroku Java CLI plugin

GitHub Heroku Deploy War/Jar