Payara Micro の GAV デプロイ

この記事は Payara Advent Calendar 2016 の 20 日目です。昨日は @backpaper0 さんの「PayaraをDockerで動かす」です。昨年の前半に Payara の Mike Croft (@croft) が中心となって進めていたプロジェクトの成果を日本語で確かめるよい機会です。Docker 環境をすぐに使用できる方は是非お試しください。

去る 12 月 3 日に開催された JJUG CCC 2016 Fall にて、「Payara Micro の設計と実装」と題した発表を行いました。その後のフィードバックで、Maven リポジトリ上の WAR ファイルを Payara Micro へ直接デプロイできることに驚かれた方も少なくなかったようなので、今回はごく簡単なサンプルを用いて、Maven リポジトリからのデプロイ (GAV デプロイ) についてお話ししようと思います。初回こそ Maven 環境を整えるという面倒な作業を要しますが、一度環境を整備すればその後は楽に作業を進められます。

1. 事前準備: WAR ファイルの作成とリポジトリへの登録

まずは WAR ファイルをアップロードする Maven リポジトリが必要です。Maven Central が使用できるのであれば、それを使用するのが最も簡単です。Maven Central へのアップロード方法については http://maven.apache.org/guides/mini/guide-central-repository-upload.html を参照してください。Maven Central は使用できないが独自にホスティング環境を持っている場合には、Sonatype Nexus で Maven リポジトリを構築すると良いでしょう。

私は Maven Central へのアップロード経験がなく、かの場所のワークフローも面倒に思えたので、VPS (ConoHa) を借りて Nexus をインストールしました (MSDN の Azure にも Nexus をホスティングしているのですが、通信量の制約が...)。

アップロードする WAR は、Payara Micro で動作するものであれば何でも良いです。GAV デプロイでも必要であれば複数の WAR をデプロイすることができます。ただし、Snapshot バージョンの場合は設定次第で苦戦するかもしれませんので、それを避けたければ Release バージョンをアップロードしましょう。

2. Payara Micro API を用いた GAV デプロイの実際

今回はとりあえず、JAX-RS で "Hello, world" を出力する WAR ファイルを作りました。コードは https://github.com/khasunuma/helloweb/tree/version-1.0 にあります (実際は HTML/XML/JSON の 3 出力形式に対応するとか、余計なことをしています)。この WAR ファイルは私がホスティングしている Nexus にアップロード済みです。

まずはコマンドラインから、以下のように実行してください。

java -jar payara-micro-4.1.1.164.jar --deployFromGAV jp.coppermine.samples:helloweb:1.0.0 --additionalRepository http://repo1.cubiwano.org/repository/maven-public

--deployFromGAV で WAR ファイルの groupId、artifactId および version を指定します。また、Maven Central 以外のリポジトリ (特に in-house リポジトリ) にある場合は、その URL (今回は http://repo1.haswell.jp/repository/maven-public) を指定します。これだけでデプロイはできるはずです。

【注意】 上記の Maven リポジトリ (repo1.cubiwano.org) は HTTP と HTTPS の両方に対応させていますが、GAV デプロイの際は "HTTP" を指定してください。

このサンプルの動作確認は、ブラウザで http://localhost:8080/helloweb/api/hello を開くことでできます。"Hello, world" が出力されていれば OK です。

Payara Micro API を使用する場合は、以下のようにコーディングします (完全なコードは https://github.com/khasunuma/payaramicro-gav にあります)。

package jp.copermine.samples.payaramicro;

import fish.payara.micro.BootstrapException;
import fish.payara.micro.PayaraMicro;

public class GavDeploy {

    public static void main(String[] args) throws BootstrapException {
        // Required if not using Maven central repository 
        final String repositoryUrl = "http://repo1.cubiwano.org/repository/maven-public";
        
        // groupId , artifactId , version
        // if version is SNAPSHOT, it may not run well
        final String gav = "jp.coppermine.samples,helloweb,1.0.0";
        
        PayaraMicro.getInstance().addRepoUrl(repositoryUrl).addDeployFromGAV(gav).setNoCluster(true).bootStrap();
    }

}

明日は @wreulicke さんです。