トピック「アドベントカレンダー」について
この記事は「Java EE Advent Calendar 2015 - Qiita」の1日目のエントリーです。
明日は@empressiaさんです。
今年のAdvent Calendar、ネタがないなぁ…と思っていた所、以下ツイートを拝見しました。
きっと寺田さんご自身はJava EEとMicrosoft Azureに関連するネタを書かれるだろうと(勝手に)思って、このKumuluzEEをネタとして利用させて頂きますm(_ _)m
KumuluzEEとは?
KumuluzEEはJava EEでマイクロサービスを実現するためのフレームワークです。
読み方は…なんですかね(^^;;
KumuluzEE
毎年JavaOneで発表されるDuke's Choice Awardという名誉ある賞(KumuluzEEのサイトではJavaのオスカー賞的な表現してますね)を今年受賞したプロダクトで、Java ChampionのMatjaz Bさんが中心に進めているものです。
KumuluzEEとはなにか?をすごくざっくり言えば…
アプリケーションサーバによって一枚岩に提供されるJava EEの仕様群をバラして、自分が利用したい仕様のみを依存させることができるフレームワーク
といった感じでしょうか。つまり、使いたい仕様だけを取り込んだモジュールを作り、それ自身をマイクロサービスにできるものです。
以下のページにある図で、わかりやすくイメージが書かれています。
ee.kumuluz.com
思想的にはSpring BootやWildFly Swarmなどと同じなのかなと。既に似たようなプロダクトがある中、Duke's Choice Awardに選ばれた1つの理由として挙げられていたのは、コミュニティベースに作られたフレームワークという点でした。Java EEのアプリケーションサーバを提供しているベンダではない、という。確かに、WildFly SwarmならRedHatさん、Payara MicroならPayaraさんといった所が力を入れています。
KumuluzEEの使い方に関する詳細はあとで書きますが、例えば簡単にJAX-RSのコードを書いて
@Path("/rest")
public class RestResource {
@GET
@Produces(value = MediaType.APPLICATION_JSON)
public Response getResources() {
Map<String, String> json = new HashMap<>();
json.put("nogizaka46", "mai shiraishi");
return Response.ok(json).build();
}
}
ビルドして、以下コマンドで実行します。KumuluzEEではフレームワーク側でMain関数を持ってるので、自分でMain含んだクラス定義も不要になっています。
java -cp target\classes;target\dependency\* com.kumuluz.ee.EeApplication
実行するとjettyが起動して
2015-12-01 16:26:59.197:INFO:oejs.Server:main: Started @1335ms
12 01, 2015 4:26:59 午後 com.kumuluz.ee.jetty.JettyServletServer startServer
情報: Jetty started
12 01, 2015 4:26:59 午後 com.kumuluz.ee.EeApplication initialize
情報: KumuluzEE started successfully
URLにアクセスすると
こんな感じに非常にお手軽です。ここではJAX-RSを例にしましたが、以下
- Servlet 3.1 (Jetty)
- JSP 2.3 (RI JSP)
- EL 3.0 (RI UEL)
- CDI 1.2 (RI Weld)
- JPA 2.1 (RI EclipseLink, Hibernate)
- JAX-RS 2.0 (RI Jersey, RESTEasy)
- JAX-WS 2.2 (RI Metro)
- JSF 2.2 (RI Mojarra)
- Bean Validation 1.1 (RI Hibernate validator)
- JSON-P 1.0 (RI JSONP)
に対応しているとのことです。なお、コードなどは以下に。
github.com
Microservice
今年、勉強会やカンファレンスなどへ行くたびに「Microservice」という単語を耳にしていた気がします。
(Java系での)狭義な言い方では、java -jar XxxxService.jarみたいに起動できるもの、という説明から、SOAなど歴史的な背景を含めたアーキテクチャ論まで、幅広く話があったかと。
自分がMicroserviceという単語を聞いたのは多分、昨年Spring Bootを知った辺りです。Spring Bootに関してはこんな感想も。
自分はJava EEを選びながらも、やっぱりあちこちで評判なSpring Bootはホント気になります(^^;;;
Spring Bootに興味ある方は以下書籍からですかね!
Java EEにおけるMircoserviceのプロダクトとしては
WildFly Swarm · WildFly
Introducing Payara Micro
などが出てきています。あとTomEE Shadesなんてのがあるん…ですかね?ちょっと調べられませんでしたが。
KumuluzEEの設定
私はNetBeansで試したので、一応メモ書き程度に手順を書いておきます。
ここでは、冒頭に例で示したJAX-RSを動かすコードを作る手順を示しますが、ServletやJPAでは依存性の定義を変えるくらいで、手順はほぼ同じだと思います。
「ファイル」->「新規プロジェクト」を選択
カテゴリ「Maven」で「Javaアプリケーション」を選択
プロジェクト名などは適当に
pom.xmlにタグを追加
依存性で定義するライブラリのバージョンが一式合っていないと駄目らしいので、プロパティに以下追加が推奨されてます。
<kumuluzeeversion>1.0.0</kumuluzeeversion>
pom.xmlに依存性を定義
JAX-RSを動かすため、依存性は以下を追加します。
<dependencies>
<dependency>
<groupId>com.kumuluz.ee</groupId>
<artifactId>kumuluzee-core</artifactId>
<version>${kumuluzee.version}</version>
</dependency>
<dependency>
<groupId>com.kumuluz.ee</groupId>
<artifactId>kumuluzee-servlet-jetty</artifactId>
<version>${kumuluzee.version}</version>
</dependency>
<dependency>
<groupId>com.kumuluz.ee</groupId>
<artifactId>kumuluzee-jax-rs</artifactId>
<version>${kumuluzee.version}</version>
</dependency>
</dependencies>
また、コマンドから実行するとき用に、以下pluginを追加します。
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-dependency-plugin</artifactId>
<version>2.10</version>
<executions>
<execution>
<id>copy-dependencies</id>
<phase>package</phase>
<goals>
<goal>copy-dependencies</goal>
</goals>
</execution>
</executions>
</plugin>
</plugins>
</build>
JAX-RSのコードを追加
デフォルトで作成されたパッケージに以下コードを追加します。
RestResource.java
package advent.kumuluzsample;
import java.util.HashMap;
import java.util.Map;
import javax.ws.rs.GET;
import javax.ws.rs.Path;
import javax.ws.rs.Produces;
import javax.ws.rs.core.MediaType;
import javax.ws.rs.core.Response;
@Path("/rest")
public class RestResource {
@GET
@Produces(value = MediaType.APPLICATION_JSON)
public Response getResources() {
Map<String, String> json = new HashMap<>();
json.put("nogizaka46", "mai shiraishi");
return Response.ok(json).build();
}
}
RestApplication.java
package advent.kumuluzsample;
import javax.ws.rs.ApplicationPath;
import javax.ws.rs.core.Application;
@ApplicationPath("/")
public class RestApplication extends Application {
}
プロジェクトファイルとしてはこれで準備は終わりなのですが、resources/webappフォルダを用意しないと実行時に以下エラーがでてしまうので作ります。
Exception in thread "main" java.lang.IllegalStateException: No 'webapp' director
y found in the projects resources folder. Please add it to your resources even i
f it will be empty so that the servlet server can bind to it. If you have added
it and still see this error please make sure you have at least one file/class in
your projects as some IDEs don't build the project if its empty
at com.kumuluz.ee.EeApplication.checkRequirements(EeApplication.java:75)
at com.kumuluz.ee.EeApplication.initialize(EeApplication.java:48)
at com.kumuluz.ee.EeApplication.(EeApplication.java:27)
at com.kumuluz.ee.EeApplication.main(EeApplication.java:39)
空のフォルダだけでも、とあるのですが、自分の手元では何かファイルがないとコピーしてくれなかったので、とりあえず適当にhtmlだけ置いてました。
で、あとはコマンドで実行できます。
java -cp target\classes;target\dependency\* com.kumuluz.ee.EeApplication
NetBeansで普通に実行すると…Mainクラスがないと
実際には依存性に入っているkumuluzee-core-1.0.0.jarのEeApplicationクラスがMainメソッドをもっています。
NetBeansでこれをキックってできないんだろうか…
ということで、1日目は以上です。明日は@empressiaさんよろしくおねがいします!