normalian blog

Let's talk about Microsoft Azure, ASP.NET and Java!

WildFly Swarm で JAX-RS アプリを動かしてみる #1

今回は Microsoft Azure からちょっと外れ、WildFly Swarm という WildFly プロジェクトの派生プロジェクトをいじってみる。

WildFly Swarm って何?

WildFly Swarm とは Java EE 系の AP サーバ起動が遅かったり、Java EE 系の仕様策定が遅めで各仕様のバージョンアップを個別にしたい等、様々な課題に対しての解決策として提示された機能っぽい*1。Spring Boot の様に実行コンテナごと Fat Jar 化する機能を持っている。

まずは疎通をとってみる

簡単に疎通をとって動かしてみるサンプルとして JAX-RS が簡単そうだったので以下のように動かすとする。以下を参照いただければわかる通り、わずかな plugin 設定と wildfly-swarm-jaxrs への参照設定を追加する程度でアプリケーションの作成が可能になる。

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
	<modelVersion>4.0.0</modelVersion>

	<groupId>com.mydomain</groupId>
	<artifactId>HelloWildFlySwarm</artifactId>
	<version>0.0.1-SNAPSHOT</version>
	<packaging>jar</packaging>
	<name>HelloWildFlySwarm</name>
	<url>http://maven.apache.org</url>

	<properties>
		<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
	</properties>
	<build>
		<plugins>
			<plugin>
				<groupId>org.wildfly.swarm</groupId>
				<artifactId>wildfly-swarm-plugin</artifactId>
				<configuration>
					<mainClass>com.mydomain.HelloWildFlySwarm.App</mainClass>
				</configuration>
				<executions>
					<execution>
						<goals>
							<goal>package</goal>
						</goals>
					</execution>
				</executions>
			</plugin>
		</plugins>
	</build>
	<dependencies>
		<dependency>
			<groupId>org.wildfly.swarm</groupId>
			<artifactId>wildfly-swarm-jaxrs</artifactId>
			<version>1.0.0.Alpha4</version>
		</dependency>
	</dependencies>
</project>

以下を参照いただければ分かるが main 関数内で一つ以上の deploy を実施する必要がある。

package com.mydomain.HelloWildFlySwarm;

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

import com.mydomain.HelloWildFlySwarm.jaxrs.RootApi;

public class App {
	public static void main(String[] args) throws Exception {
		Container container = new Container();
		JAXRSArchive jaxrsDeployment = ShrinkWrap.create(JAXRSArchive.class);
		jaxrsDeployment.addClass(RootApi.class);
		jaxrsDeployment.addAllDependencies();
		container.start().deploy(jaxrsDeployment);
	}
}

また、上記では ShrinkWrap を利用している。

package com.mydomain.HelloWildFlySwarm.jaxrs;

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

@Path("/")
public class RootApi {

	@GET
	@Produces("text/plain")
	public String get() {
		return "Hello WildFly Swarm";
	}
}

以下の Maven コマンドをたたいて実行すると、AP サーバを立ち上げることなく REST アプリケーションの立ち上げが可能だ。

>mvn clean wildfly-swarm:run

jar ファイルが 30MB 程度になっており、なかなかのサイズになっていた。実行コンテナ、依存 jar も含まれるからまぁそんなもんかというところ。

TIPS

初回動作させる際に Failed to resolve artifact 'org.jboss.msc:jboss-msc:1.2.6.Final' が発生していた。Swarm でなく Maven 側の依存解決の問題となるが、以下を一時的に追加して自身のローカルリポジトリに以下の jar を配置することで回避できる。

		<dependency>
			<groupId>org.jboss.msc</groupId>
			<artifactId>jboss-msc</artifactId>
			<version>1.2.6.Final</version>
		</dependency>
		<dependency>
			<groupId>org.jboss.spec.javax.sql</groupId>
			<artifactId>jboss-javax-sql-api_7.0_spec</artifactId>
			<version>1.1.0.Final</version>
		</dependency>

*1:誰か間違っていたら突っ込みをお願いしたい