[ニンジャ]Play1ライクなJavaフレームワーク-”Ninja web framework”

2013.05.07

シンプルなJava用フルスタックフレームワーク

Ninja web framework(以下Ninja)とは、2012年に開発が開始された、かなり新しいJava用フレームワークです。
Play framework(Play1 Java)に強く影響を受けているようで、使い勝手は近いものがあります。
しかし、Playとは違い、Servletを使用していたり、Google Guiceに依存しているといった大きな違いがあります。
ここにあるように、Ninjaは次のようなことを目標に開発されています。

  • フルスタックのWebフレームワークを提供
  • 高速な開発
  • ウェブフレンドリー&シンプルアーキテクチャ&シンプルプログラミングモデル
  • 簡単にスケーラブル可能
  • バイトコードマジックは使わない
  • 標準に基づいて構築できること:Maven使用、DIをGuiceに依存、サーブレットコンテナ使用
  • Playと共通することも多いですが、違う部分もかなりありますね。このフレームワークの開発者は、元々Play1を使用していたようです。
    2012年にPlay2がリリースされましたが、あまりに大きな変更(Scala,sbtの採用とか)が多かったため、
    いろいろ考えた末に新しくフレームワークを開発することになったようです。

    今回は、とりあえずNinjaフレームワークを動かしてみましょう。

    環境構築方法

    今回使用した動作環境は以下のとおりです。ビルドにMavenを使用するので、インストールしておきましょう。

    • OS : MacOS X 10.7.5
    • Java : 1.7.0_17
    • Maven : 3.0.3
    • Git : 1.8.2.1

    動かしてみよう

    現状、Ninjaを簡単にインストールしてcreat new porject・・・みたいにする方法はまだありません。(たぶん)
    git cloneでNinjaをもってきて、用意されているデモ(ninja-core-demo)を使用する方法が簡単みたいです。
    (また、新しくプロジェクトを作りたい場合、このデモをベースにしてつくると楽らしい)

    % git clone https://github.com/reyez/ninja.git
    % cd ninja
    

    ninjaディレクトリに移動したら、Mavenでclean&installをします。必要モジュールのインストールからテストまで数分かかります。

    % mvn clean install

    ninja-core-demoに移動して、mvnでjettyを起動してみましょう。
    Playみたいなコンソール表示が出た後、8080ポートで起動します。

    % cd ninja-core-demo
    % mvn jetty:run
    [INFO] Scanning for projects...
    [INFO]
    [INFO] ------------------------------------------------------------------------
    [INFO] Building ninja demo application 1.4-SNAPSHOT
    [INFO] ------------------------------------------------------------------------
    [INFO]
    [INFO] >>> maven-jetty-plugin:6.1.22:run (default-cli) @ ninja-core-demo >>>
    11:46:04.472 [main] INFO  ninja.i18n.MessagesImpl - Did not find conf/messages.en.properties but it was specified in application.conf. Using default language instead.
     _______  .___ _______        ____.  _____
     \      \ |   |\      \      |    | /  _  \
     /   |   \|   |/   |   \     |    |/  /_\  \
    /    |    \   /    |    \/\__|    /    |    \
    \____|__  /___\____|__  /\________\____|__  /
         web\/framework   \/                  \/
    
    11:46:04.753 [main] INFO  ninja.lifecycle.LifecycleServiceImpl - Starting Ninja application...
    11:46:04.761 [main] INFO  ninja.lifecycle.LifecycleServiceImpl - Ninja application started in 7ms
    2013-05-02 11:46:04.855:INFO::Started SelectChannelConnector@0.0.0.0:8080
    [INFO] Started Jetty Server
    [INFO] Starting scanner at interval of 1 seconds.
    

    起動したら、http://localhost:8080にアクセスしてみてください。
    /examplesとかを見ると、どんな機能があるかわかります。

    中身を軽く見てみる

    どんな構成になっているのか、軽く見てみましょう。
    ディレクトリ構成はMavenの標準構成ですね。
    ninja-core-demo/src/main/conf/Routes.javaにルーティングを定義するファイル(Playでいうroutes)があります。
    ここでurlとコントローラ(とメソッド)を紐付けてます。

    ・
    ・
    public class Routes implements ApplicationRoutes {
        
        private NinjaProperties ninjaProperties;
    
        @Inject
        public Routes(NinjaProperties ninjaProperties) {
            this.ninjaProperties = ninjaProperties;
    
        }
    
        @Override
        public void init(Router router) {
            router.GET().route("/").with(ApplicationController.class, "index");
            router.GET().route("/examples").with(ApplicationController.class, "examples");
            ・
            ・
        }
    }
    

    confディレクトリには、他にも各種設定ファイルがあり、アプリケーション全体の設定やメッセージの定義をしています。
    これら定義ファイルはPlayにあったものと似ていますね。

    また、ninja-core-demo/src/main/controllers以下には、コントローラを定義しています。
    Play1みたいにstaticメソッドは使用してませんが、シングルトンで管理されています。

    //ApplicationController.java
    ・
    ・
    @Singleton
    public class ApplicationController {
    
        /**
         * This is the system wide logger. You can still use any config you like. Or
         * create your own custom logger.
         * 
         * But often this is just a simple solution:
         */
        @Inject
        public Logger logger;
    
        @Inject
        Lang lang;
    
        public Result examples(Context context) {
            logger.info("In example ");
            // Default rendering is simple by convention
            // This renders the page in views/ApplicationController/index.ftl.html
            return Results.html();
    
        }
    
        public Result testPage() {
            return Results.html();
    
        }
    
        public Result index(Context context) {
            // Default rendering is simple by convention
            // This renders the page in views/ApplicationController/index.ftl.html
            return Results.html();
      }
    ・
    ・
    }
    

    なお、ビューはFreeMarkerというテンプレートエンジンを使用しているみたいです。

    まとめ

    いかがでしょうか。今回はJava用フルスタックフレームワークである、Ninja web frameworkを紹介しました。
    Playに似た部分もありつつ、他のライブラリもうまく取り入れてシンプルに作っている印象ですね。
    Play1を使ったことがある人なら、比較的簡単に理解できるのではないでしょうか。
    なお、DBアクセスの仕組みはとくに用意せず、ユーザーが任意に使用できるようになっているみたいです。

    参考サイトなど