= Super Dev Mode =

以下ではEclipse Luna、GWT2.7、Google Plugin for Eclipse 4.4を前提としている。

== Dev Modeの問題点 ==

 * Dev Modeを使用するには、ブラウザ側に専用のプラグインを追加する必要があるが、これは最近のブラウザではもはやサポートされなくなっている。<<BR>>このため、Firefox+pluginにてDev Modeを使用した開発を行うには、わざわざ過去のバージョンのFirefoxを使用しなければならない。
 * Dev Modeは遅い。

== Dev ModeとSuper Dev Modeの違い ==

※参考にあげたリンクより

 * ブラウザプラグインが不要なため、モバイルブラウザでも動作する。
 * Java/JavaScript間の呼び出しが無く、ネットワークラウンドトリップが省略されるため、アプリが高速に動作する。
 * 一つのデバッグセッションで、Java,JavaScript,他のクライアントサイド言語をデバッグできる。これは特にGWTからJavaScriptライブラリを呼び出す際に有用。
 * ブラウザのデバッガはDOMブレークポイント等の機能を持つため、GWTコードをデバッグするのに有用。

ただし、以下のデメリットもある

 * 現在のブラウザはsourcemapsをサポートしているが (クライアントのデバッグにはsourcemapsを使う)、このデバッグ方法を最もよくサポートしているのはchromeである。
 * chromeデバッガでの変数デバッグ時にはフィールド名と値はJavaScriptになる。Javaではない。
 * Super Dev Modeはwarファイルをサポートしない
 * Super Dev ModeはJVM上で動作するGWTアプリではないため、いくつかの実行時チェックは働かない。例えば、IndexOutOfBoundsExceptionは起こらない。

※特に注意すべき点

 * IndexOutOfBoundsExceptionどころか、例外が起こってもそれがどこにも表示されない。無視されてしまう。このため、クライアント側で起こった例外を何らかの方法を使ってすぐに表示しなければいけない。

== Super Dev Mode使用の準備 ==

Dev Modeで開発していたプロジェクトをSuper Dev Mode用にするには、何点か書き換えを行う必要がある。これはGWT2.7以前からGWT2.7への対応も含まれる。

 * Google Web Toolkitを、gwt2.7以前の、例えばgwt2.6.1からgwt2.7に変更する。
 * .gwt.xmlの中にgwt.logging.firebugHandler、gwt.logging.popupHandlerを使用している場合には、以下をそれらの前に挿入する。もはやサポートされていないため。
{{{
  <define-property name="gwt.logging.popupHandler" values="ENABLED, DISABLED" />
  <define-property name="gwt.logging.firebugHandler" values="ENABLED, DISABLED" />
}}}
 * 同じく.gwt.xmlの中に以下を挿入。ただし、現在のところsourcemapsの使い方はよくわからない。
{{{
    <!-- allow Super Dev Mode -->
    <add-linker name="xsiframe" />
    <!-- allow source maps -->
    <set-property name="compiler.useSourceMaps" value="true" />
    <set-configuration-property name="includeSourceMapUrl" value="true"/>
}}}

 * 当然だが、build.xmlで.warファイルを生成している場合には、その参照するgwtのバージョンも変更する。


== 通常の利用 ==

=== 初回起動 ===

 * Eclipse上にあるこれまでの起動構成(run configuration)は使わず、新たに起動構成を作成するため、プロジェクトを右クリックし、Run As > Web Application(GWT Super Dev Mode)を選択する。
 * 一旦停止し、起動URLをデフォルトから変更している場合には、起動構成に-startupUrlを追加。また、VM Argumentsの中の-Xmlの値を大きくしておかないとメモリ不足になる可能性がある。

=== ブラウザに「再コンパイル」ボタンを置く ===

起動すると、Consoleの方に

{{{
The code server is ready at http://127.0.0.1:9876/
}}}
という表示がされる。このURLにアクセスすると「Dev Mode On」「Dev Mode Off」というボタンが表示されるので「Off」の方をブックマークして、「GWT再コンパイル」などという名前をつける(なぜかOnの方はうまく動作しない)。GWTマニュアルでは、「再コンパイルボタン」は自動的に表示されるとあるが、なぜか表示されないためこうする。

=== デバッグ対象の表示 ===

Development Modeの方に
{{{
http://127.0.0.1:9876/Test.html
}}}
あるいは、起動URLをルートにしている場合
{{{
http://127.0.0.1:9876/
}}}
などという表示がされるので、ここにアクセスする。この時、目的画面が表示される以前に「Compiling ...」という表示がされ若干待たされる。

=== クライアントの再コンパイル ===

起動したままクライアントコードを変更し、「GWT再コンパイル」ボタンで再コンパイルすることができる。もちろん、画面はリロードされてしまうことに注意。
このときはそれほど待たされることはない。


== デバッグ ==

=== サーバ側 ===

サーバ側のデバッグはこれまで通り。Eclipseのデバッガでデバッグを行うことができ、またサーバコードを変更した場合、再起動しなければそれは反映されない。
「GWT再コンパイル」ボタンはクライアントコード用であるので、これを押しても無意味。


=== クライアント側 ===

クライアント側のデバッグはEclipseでは不可能になった。

これは研究中

== ログ出力 ==

サーバ側はこれまで通り。クライアント側のログ出力はコンソールには出力されなくなった。つまり、java.util.logging.Loggerを使用してログを出力した場合、それはデバッガで表示させる必要がある(本番環境と同じ)。Firefoxの場合には、FireBugのコンソールに出力される。chromeでもほぼ同様。



== 参考ほか ==

 * [[http://www.gwtproject.org/articles/superdevmode.html]]