Payara micro で Hello World

f:id:Naotsugu:20161002032336p:plain

Payara とは

Glassfish から fork した JavaEE アプリケーションサーバです。 Glassfish は Oracle による商用サポートの提供が廃止されましたが、Payara は Payara Team による商用サポートが提供されています。 Glassfish 4.1 のコードベースに対してバグフィックスや周辺ライブラリのアップデートの取り込み、新機能の取り込みなどが行われています。

Hazelcast を組み込むことで JCache API(JSR 107)の取り込みやデータグリッドの追加、マイクロサービス向けの Payara Micro の提供など、積極的な開発が続けられています。

Payara micro

Spring Boot や Wildfly Swarm のようなマイクロサービス向けの Payara パッケージです。 JavaEE の war ファイルを Payara micro 起動時のコマンドライン引数で渡したり、Payara micro と アプリケーション war ファイルをまとめて一つの実行可能JAR(Uber JAR)にしたりできます(Uber はドイツ語で over、普通のJARの上を行くJARといった感)。

以下のように起動したり、

$ java -jar payara-micro.jar --deploy /home/user/example.war

以下のように実行可能JARを作ったりできます。

$ java -jar payara-micro.jar --deploy test.war --outputUberJar test.jar
$ java -jar test.jar

コマンドラインでの操作の他に Programmatically な操作もできるようになっています。

ここでは Payara micro で簡単に Hello World してみましょう。

JAX-RS リソース

最初に、なんでもいいですが JAX-RS リソース作成しておきます。

まずはアプリケーションクラス。

package code.app;

import javax.ws.rs.ApplicationPath;
import javax.ws.rs.core.Application;

@ApplicationPath("/app")
public class MyApplication extends Application {
}

リソースクラス。

package code.app;

import javax.ws.rs.GET;
import javax.ws.rs.Path;
import javax.ws.rs.Produces;

@Path("/")
public class MyResource {
    @GET
    @Produces("text/plain")
    public String get() {
        return "Hello world";
    }
}

PayaraMicro

PayaraMicro のエントリポイントを作成します。

package code.payara;

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

public class EmbeddedPayara {

    public static void main(String[] args) throws BootstrapException {
        PayaraMicro.getInstance().addDeployment(args[0]).bootStrap();
    }
}

単純にインスタンス作成してコマンドライン引数で指定されたwarをデプロイしています。

build.gradle

Gradle のビルドファイルです。

apply plugin: 'war'

[compileJava, compileTestJava]*.options*.encoding = 'UTF-8'
sourceCompatibility = targetCompatibility = '1.8'

repositories {
    jcenter()
}

dependencies {
    providedCompile 'fish.payara.extras:payara-micro:4.1.153'
}

war { 
    archiveName = 'payara'
    exclude('**/payara/**')
}

task run(type: JavaExec) {
    classpath = sourceSets.main.runtimeClasspath
    main = 'code.payara.EmbeddedPayara'
    args war.archivePath.path
}

普通にwarを作るだけと、起動用に run タスクを定義しています。

EmbeddedPayara は war から除外しています。

実行

では実行してみましょう。

./gradlew war run

f:id:Naotsugu:20161002032129p:plain

簡単ですね。