今回は 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 への参照設定を追加する程度でアプリケーションの作成が可能になる。
- pom.xml
<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 を実施する必要がある。
- App.java
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 を利用している。
- RootApi.java
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:誰か間違っていたら突っ込みをお願いしたい