Wildfly Swarm で JavaEEアプリケーションを FatJAR 化する

wildfly-swarm とは

  • JavaEE アプリケーションを Dropwizard や Spring Boot のようにコンテナごと fat JAR 化する
  • 先日 1.0.0.Alpha4 がリリース
  • WildFly 10.0.0.Beta1をベース
  • 以前から要望のあった Netflix OSS サポート(Ribbon, Hystrix)
  • Keycloak による認証
  • Logstash によるログの収集

などなどJavaEEの基本機能に加え、マイクロサービス向けの機能が盛り込まれている。

使い方

以前は Maven のサポートのみだったが、Gradle むけプラグインが出来た。

以下でプロジェクト作成。

mkdir wildfly-swarm-example1
cd wildfly-swarm-example1
gradle init --type java-library


プラグインの導入は build.gradle に以下のように定義する。

buildscript {
  version = '1.0.0.Alpha4-SNAPSHOT'
  repositories {
    jcenter()
  }
  dependencies {
    classpath 'org.wildfly.swarm:wildfly-swarm-plugin:1.0.0.Alpha4'
  }
}

apply plugin: 'wildfly-swarm'

アプリケーションは Mainメソッドから起動するので mainClassName を指定し、swarm プラグインの設定でポートを定義する。

mainClassName = 'example.Main'

swarm {
  properties {
    jboss.http.port = 8080
  }
}


build.gradle 全体は以下のようになる。

buildscript {
  version = '1.0.0.Alpha4-SNAPSHOT'
  repositories {
    jcenter()
  }
  dependencies {
    classpath 'org.wildfly.swarm:wildfly-swarm-plugin:1.0.0.Alpha4'
  }
}

apply plugin: 'wildfly-swarm'
apply plugin: 'java'
apply plugin: 'application'

mainClassName = 'example.Main'

swarm {
  properties {
    jboss.http.port = 8080
  }
}

repositories {
    jcenter()
}

dependencies {
    compile "org.wildfly.swarm:wildfly-swarm-jaxrs:1.0.0.Alpha4"
    compile 'org.slf4j:slf4j-api:1.7.7'
    testCompile 'junit:junit:4.12'
}


JAX-RS リソースとして以下を作成する。

package example;

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";
    }
}


アプリケーションはMainメソッドにて ShrinkWrap を使って仮想的なアーカイブを作成してデプロイする。

package example;

import org.jboss.shrinkwrap.api.ShrinkWrap;
import org.wildfly.swarm.container.Container;
import org.wildfly.swarm.jaxrs.JAXRSArchive;

public class Main {

    public static void main(String... args) throws Exception {

        Container container = new Container();

        JAXRSArchive deployment = ShrinkWrap.create(JAXRSArchive.class);
        deployment.addClass(MyResource.class);
        deployment.addAllDependencies();
        container.start().deploy(deployment);

    }
}

JAXRSArchive として deployment.addClass(MyResource.class) にてJAXRS リソースデプロイに追加する。

実行

以下で wildfly-swarm-example1-swarm.jar jarファイル作成する。

./gradlew clean wildfly-swarm-package

jarファイルができるので、あとは実行するだけ。

wildfly-swarm-example1-swarm.jar を実行。

java -jar ./build/libs/wildfly-swarm-example1-swarm.jar


tmpDir: /var/folders/18/ffp649395k959gg_65t1nhjc0000gn/T/
02:08:46,033 INFO  [org.jboss.msc] (main) JBoss MSC version 1.2.6.Final
02:08:46,200 INFO  [org.jboss.as] (MSC service thread 1-6) WFLYSRV0049: WildFly Core 2.0.0.Beta1 "Kenny" starting
2015-09-21 02:08:47,011 INFO  [org.jboss.as.security] (ServerService Thread Pool -- 11) WFLYSEC0002: Activating Security Subsystem
2015-09-21 02:08:47,014 INFO  [org.wildfly.extension.io] (ServerService Thread Pool -- 12) WFLYIO001: Worker 'default' has auto-configured to 8 core threads with 64 task threads based on your 4 available processors
2015-09-21 02:08:47,016 INFO  [org.jboss.as.security] (MSC service thread 1-3) WFLYSEC0001: Current PicketBox version=4.9.2.Final
2015-09-21 02:08:47,022 INFO  [org.jboss.as.naming] (ServerService Thread Pool -- 13) WFLYNAM0001: Activating Naming Subsystem
2015-09-21 02:08:47,088 INFO  [org.jboss.as.naming] (MSC service thread 1-1) WFLYNAM0003: Starting Naming Service
2015-09-21 02:08:47,112 INFO  [org.wildfly.extension.undertow] (MSC service thread 1-7) WFLYUT0003: Undertow 1.3.0.Beta6 starting
2015-09-21 02:08:47,112 INFO  [org.wildfly.extension.undertow] (ServerService Thread Pool -- 9) WFLYUT0003: Undertow 1.3.0.Beta6 starting
2015-09-21 02:08:47,165 INFO  [org.xnio] (MSC service thread 1-7) XNIO version 3.3.1.Final
2015-09-21 02:08:47,177 INFO  [org.xnio.nio] (MSC service thread 1-7) XNIO NIO Implementation Version 3.3.1.Final
2015-09-21 02:08:47,217 INFO  [org.wildfly.extension.undertow] (MSC service thread 1-5) WFLYUT0012: Started server default-server.
2015-09-21 02:08:47,286 INFO  [org.wildfly.extension.undertow] (MSC service thread 1-4) WFLYUT0006: Undertow HTTP listener default listening on /0:0:0:0:0:0:0:0:8080
2015-09-21 02:08:47,592 INFO  [org.jboss.as] (Controller Boot Thread) WFLYSRV0025: WildFly Core 2.0.0.Beta1 "Kenny" started in 1613ms - Started 65 of 71 services (13 services are lazy, passive or on-demand)
2015-09-21 02:08:47,975 INFO  [org.jboss.as.server.deployment] (MSC service thread 1-6) WFLYSRV0027: Starting deployment of "6703fdd4-4821-4996-9e3b-856a110513d8.war" (runtime-name: "6703fdd4-4821-4996-9e3b-856a110513d8.war")
2015-09-21 02:08:48,636 INFO  [org.wildfly.extension.undertow] (MSC service thread 1-1) WFLYUT0018: Host default-host starting
2015-09-21 02:08:48,956 INFO  [org.jboss.resteasy.spi.ResteasyDeployment] (ServerService Thread Pool -- 8) Deploying javax.ws.rs.core.Application: class org.wildfly.swarm.generated.WildFlySwarmDefaultJAXRSApplication
2015-09-21 02:08:48,995 INFO  [org.wildfly.extension.undertow] (ServerService Thread Pool -- 8) WFLYUT0021: Registered web context: /
2015-09-21 02:08:49,132 INFO  [org.jboss.as.server] (main) WFLYSRV0010: Deployed "6703fdd4-4821-4996-9e3b-856a110513d8.war" (runtime-name : "6703fdd4-4821-4996-9e3b-856a110513d8.war")

あとは http://localhost:8080/ でアクセスするだけ(終了はCtrl-C)。

f:id:Naotsugu:20150921021158p:plain

以上、非常に簡単に JavaEE アプリケーションを単一JARとして実行できる。