G::blog

主にVert.xやYokeについての覚書

Yoke のGradleテンプレートを用いた auto-redeploy 可能な Eclipse プロジェクトの作成方法

Yoke のページでは、Yoke は Vert.x のミドルウェアフレームワークと定義されています。さらに、Node.js の connect をリスペクトしたものであるとも書かれています。

この記事では、Yokeのチュートリアルを土台にして、auto-redeploy 可能な Eclipse プロジェクトを作成します。

※ Vert.x の要求によりJDK 1.7.0かそれ以降が必要です。

●関連する主なプロジェクト:
Vert.x
Yoke
Gradle

1. Yoke の Gradle テンプレートを入手し、プロジェクトの作業ディレクトリを作る

まず、Gradle テンプレートを取得し、それを利用してプロジェクトの作業ディレクトリを作成します。
とても簡単です。展開して名前を変えるだけです。

$ curl -0 http://pmlopes.github.io/yoke/yoke-gradle-template.tar.gz | tar -zx
$

$ mv yoke-gradle-template yoke-tutorial
$ cd yoke-tutorial
$

2. Verticle クラスを書く

チュートリアルに沿って src/main/java/com/jetdrone/yoke の下に、以下の内容の Java ファイルを作ります。ファイル名は HelloWorldVerticle.java とします。

package com.jetdrone.yoke;

import com.jetdrone.vertx.yoke.*;
import com.jetdrone.vertx.yoke.middleware.*;

import org.vertx.java.core.*;
import org.vertx.java.platform.*;

public class HelloWorldVerticle extends Verticle {

    @Override
    public void start() {
        Yoke yoke = new Yoke(vertx);
        yoke.use(new Handler<YokeRequest>() {
            @Override
            public void handle(YokeRequest request) {
                request.response().end("Hello World");
            }
        });
        yoke.listen(8080); 	
    }
}

3. mod.jsonファイルを編集する

src/main/resources の下に、mod.json があります。次のように修正します。

{
    "main": "com.jetdrone.yoke.HelloWorldVerticle",
    "includes": "com.jetdrone~yoke~1.0.0-beta2",
    "auto-redeploy": true
}

チュートリアルには、

"auto-redeploy": true

がありません。これを入れておくと、クラスファイルやリソースの変更を Vert.x がキャッチして、自動的にデプロイしなおしてくれます。

"main" には、「2. Verticleクラスを書く」で作成した Java クラスのフルパス名を記述します。

4. 最新の Vert.x を利用するように gradle.properties を修正する

現時点の最新は、2.0.0-CR1 なので、次のように修正しました。

# The version of Vert.x
#vertxVersion=2.0.0-beta3
vertxVersion=2.0.0-CR1

5. Eclipse 用のタスクを追加

gradle/vertx.gradle の適当な位置に、次のタスクを追加します。

task runModEclipse(dependsOn: copyMod, description: 'Run the module using all the build dependencies (not using installed vertx') << {
  setSysProps()
  def classpath = [new URL("file:./bin/")] as URL[]
  def pm = PlatformLocator.factory.createPlatformManager()
  def latch = new CountDownLatch(1)
  pm.deployModuleFromClasspath(moduleName, null, 1, classpath, new AsyncResultHandler<String>() {
      public void handle(AsyncResult<String> asyncResult) {
          if (asyncResult.succeeded()) {
              println "CTRL-C to stop server"
          } else {
              println "Failed to deploy module"
              asyncResult.cause().printStackTrace()
              latch.countDown()
          }
      }
  });
  latch.await(Long.MAX_VALUE, TimeUnit.MILLISECONDS);
}

※ このタスクでは、org.vertx.java.core.file.impl.PathAdjuster 正常に機能せずしないことが分かりました。リソースの取得が正常に動作しません。詳しくは、この記事を参照してください。


このタスクを実行すると、 runMod タスクと同様にアプリケーションが起動しますが、少し違いがあります。その違いは、Eclipse 上でソースやリソースを編集するとそのビルド結果が bin ディレクトリに出力される場合に限って、auto-redeploy が機能するように classpath を指定しているところです。(このタスクは私が試行錯誤で作ったものなのでもっと良い方法があるのかもしれません。ご存じの方がいらっしゃれば教えてください)

6. Eclipse にプロジェクトをインポートする

Gradle Integration for EclipseEclipse にインストールしていない場合は、Eclipse Marketplace などからインストールします。

Gradle Integration for Eclipse の準備が整ったら、Eclipse のインポート機能で本プロジェクトをインポートします。

※ まだ試してないけど、./gradlew eclipse でもよいみたい。

7. アプリケーションを実行しブラウザで閲覧してみる

コンソール(ターミナル)から実行します。

linux/unix系は、

% ./gradlew runModEclipse

windowsは、

% gradlew.bat runModEclipse

です。

うまく起動したら、ブラウザで http://localhost:8080 にアクセスしてみます。

Hello World と表示されたら OK です。

8. Eclipse上で、編集してみる

Eclipse 上で、HelloWorldVerticle.java を編集してみます。request.response().end("Hello World") の部分の文字列を適当に変えてみるのが手ごろでしょう。

修正して保存を行ったら、ブラウザをリロードしてみます。祟りでもない限り、修正通り表示されたはずです。

gradlew を起動する前に、環境変数 JAVA_OPTS にデバッグのための引数を設定すれば、Eclipseからリモートデバッグも可能です。

例:
 -Xdebug -Xrunjdwp:transport=dt_socket,address=8002,server=y,suspend=n

9. 補足:Yoke の Java チュートリアルの誤記

http://pmlopes.github.io/yoke/#java の以下のコードは、

Yoke yoke = new Yoke(vertx)
  .use(new Favicon())
  .use(new Static("webroot"))
  .use(new Router()
    .all("/hello", new Handler<HttpServerRequest>() {
      @Override
      public void handle(HttpServerRequest request) {
        request.response().end("Hello World!");
      }
    })).listen(3000);

次のようにする必要があります。(HttpServerRequest -> YokeRequest)

Yoke yoke = new Yoke(vertx)
  .use(new Favicon())
  .use(new Static("webroot"))
  .use(new Router()
    .all("/hello", new Handler<YokeRequest>() {
      @Override
      public void handle(YokeRequest request) {
        request.response().end("Hello World!");
      }
    })).listen(3000);

(2013/06/16日現在)

10. 参照した情報

http://uehaj.hatenablog.com/entry/2013/06/03/225117
 Vert.xに注目したきっかけ
http://vertx.io/vertx20_docs/dev_guide.html#auto-redeploy-and-see-your-changes-immediately
 auto-redeployについて知ったきっかけ
https://groups.google.com/forum/?fromgroups#!searchin/vertx/auto$20redeploy
 auto-redeployについて調べた