チュートリアル¶
本章ではXitrumプロジェクトを作成して実行するところまでを簡単に紹介します。
このチュートリアルではJavaがインストールされたLinux環境を想定しています。
Xitrumプロジェクトの作成¶
新規のプロジェクトを作成するには xitrum-new.zip をダウンロードします。
wget -O xitrum-new.zip https://github.com/xitrum-framework/xitrum-new/archive/master.zip
または:
curl -L -o xitrum-new.zip https://github.com/xitrum-framework/xitrum-new/archive/master.zip
起動¶
Scalaのビルドツールとしてデファクトスタンダードである SBT を使用します。
先ほどダウンロードしたプロジェクトには既に SBT 0.13 が sbt
ディレクトリに梱包されています。
SBTを自分でインストールするには、SBTの セットアップガイド を参照してください。
作成したプロジェクトのルートディレクトリで sbt/sbt run
と実行することでXitrumが起動します:
unzip xitrum-new.zip
cd xitrum-new
sbt/sbt run
このコマンドは依存ライブラリ( dependencies )のダウンロード, およびプロジェクトのコンパイルを実行後、
quickstart.Boot
クラスが実行され、WEBサーバーが起動します。
コンソールには以下の様なルーティング情報が表示されます。
[INFO] Load routes.cache or recollect routes...
[INFO] Normal routes:
GET / quickstart.action.SiteIndex
[INFO] SockJS routes:
xitrum/metrics/channel xitrum.metrics.XitrumMetricsChannel websocket: true, cookie_needed: false
[INFO] Error routes:
404 quickstart.action.NotFoundError
500 quickstart.action.ServerError
[INFO] Xitrum routes:
GET /webjars/swagger-ui/2.0.17/index xitrum.routing.SwaggerUiVersioned
GET /xitrum/xitrum.js xitrum.js
GET /xitrum/metrics/channel xitrum.sockjs.Greeting
GET /xitrum/metrics/channel/:serverId/:sessionId/eventsource xitrum.sockjs.EventSourceReceive
GET /xitrum/metrics/channel/:serverId/:sessionId/htmlfile xitrum.sockjs.HtmlFileReceive
GET /xitrum/metrics/channel/:serverId/:sessionId/jsonp xitrum.sockjs.JsonPPollingReceive
POST /xitrum/metrics/channel/:serverId/:sessionId/jsonp_send xitrum.sockjs.JsonPPollingSend
WEBSOCKET /xitrum/metrics/channel/:serverId/:sessionId/websocket xitrum.sockjs.WebSocket
POST /xitrum/metrics/channel/:serverId/:sessionId/xhr xitrum.sockjs.XhrPollingReceive
POST /xitrum/metrics/channel/:serverId/:sessionId/xhr_send xitrum.sockjs.XhrSend
POST /xitrum/metrics/channel/:serverId/:sessionId/xhr_streaming xitrum.sockjs.XhrStreamingReceive
GET /xitrum/metrics/channel/info xitrum.sockjs.InfoGET
WEBSOCKET /xitrum/metrics/channel/websocket xitrum.sockjs.RawWebSocket
GET /xitrum/metrics/viewer xitrum.metrics.XitrumMetricsViewer
GET /xitrum/metrics/channel/:iframe xitrum.sockjs.Iframe
GET /xitrum/metrics/channel/:serverId/:sessionId/websocket xitrum.sockjs.WebSocketGET
POST /xitrum/metrics/channel/:serverId/:sessionId/websocket xitrum.sockjs.WebSocketPOST
[INFO] HTTP server started on port 8000
[INFO] HTTPS server started on port 4430
[INFO] Xitrum started in development mode
初回起動時には、全てのルーティングが収集されログに出力されます。 この情報はアプリケーションのRESTful APIについてドキュメントを書く場合この情報はとても役立つことでしょう。
ブラウザで http://localhost:8000 もしくは https://localhost:4430 にアクセスしてみましょう。 次のようなリクエスト情報がコンソールから確認できます。
[INFO] GET quickstart.action.SiteIndex, 1 [ms]
Eclipseプロジェクトの作成¶
開発環境に Eclipse を使用する場合
プロジェクトディレクトリで以下のコマンドを実行します:
sbt/sbt eclipse
build.sbt
に記載されたプロジェクト設定に応じてEclipse用の .project
ファイルが生成されます。
Eclipseを起動してインポートしてください。
IntelliJ IDEAプロジェクトのインポート¶
開発環境に IntelliJ IDEA を使用する場合、 そのScalaプラグインをインストールして、SBTプロジェクトをそのままインポートしてください。 Eclipseの場合のように事前にプロジェクトファイルを生成しなくてもいいです。
自動リロード¶
プログラムを再起動することなく .classファイルをリロード(ホットスワップ)することができます。 ただし、プログラムのパフォーマンスと安定性を維持するため、自動リロード機能は開発時のみ使用することを推奨します。
IDEを使用する場合¶
最新のEclipseやIntelliJのようなIDEを使用して開発、起動を行う場合、 デフォルトでIDEがソースコードの変更を監視して、変更があった場合に自動でコンパイルしてくれます。
SBTを使用する場合¶
SBTを使用する場合、2つのコンソールを用意する必要があります:
- 一つ目は
sbt/sbt run
を実行します。 このコマンドはプログラムを起動して、 .classファイルに変更があった場合にリロードを行います。 - もう一方は
sbt/sbt ~compile
を実行します。 このコマンドはソースコードの変更を監視して、変更があった場合に .classファイルにコンパイルします。
sbtディレクトリには agent7.jar が含まれます。
このライブラリは、カレントディレクトリ(およびサブディレクトリ)の .classファイルのリロードを担当します。
sbt/sbt
スクリプトの中で -javaagent:agent7.jar
として使用されています。
DCEVM¶
通常のJVMはクラスファイルがリロードされた際、メソッドのボディのみ変更が反映されます。 Java HotSpot VM のオープンソース実装である DCEVM を使用することで、 ロードしたクラスの再定義をより柔軟に行うことができるようになります。
DCEVMは以下の2つの方法でインストールできます:
パッチを使用してインストールを行う場合:
- DCEVMを常に有効にすることができます。
- もしくはDCEVMを”alternative” JVMとして適用することができます。
この場合、
java
コマンドに-XXaltjvm=dcevm
オプションを指定することでDCEVMを使用することができます。 例えば、sbt/sbt
スクリプトファイルに-XXaltjvm=dcevm
を追記する必要があります。
EclipseやIntelliJのようなIDEを使用している場合、DCEVMをプロジェクトの実行JVMに指定する必要があります。
SBTを使用している場合は、 java
コマンドがDCEVMのものを利用できるように PATH
環境変数を設定する必要があります。
DCEVM自体はクラスの変更をサポートしますが、リロードは行わないため、DCEVMを使用する場合も前述の javaagent
は必要となります。
詳細は DCEVM - A JRebel free alternative を参照してください。