DCEVMを使用した簡単なレシピGWTレシピIDEA

IDEA第13バージョンでは、Eclipseとは異なり、標準プラグインを使用してGWTプロジェクトを開始するとき(そして後で判明したように、プラグインなしで、しかしGWT DevModeの起動は開発およびデバッグモードで起動するためのアプリケーションです。具体的には、gwt-dev.jarのcom.google.gwt.dev.DevMode-Javaアプリケーションのように)UIコードを変更する場合、変更を有効にするにはブラウザーを更新する必要があります。 GWTの場合、これは非常に重要です-ページを更新すると、コードサーバー(プロジェクトのソースコードを持つサーバー、Javaコードをデバッグする必要がある)に再接続し、これには10秒から数分かかるためです。 ここでは、ページをほとんどリロードせずにコードを変更する方法について説明します。





エラーが発生するコードの例:



IButton b = new IButton("", new ClickHandler() { @Override public void onClick(ClickEvent event) { changedMethod(); } }); void changedMethod() { //      run time. Window.alert(" "); }
      
      







このClickHandlerでは、changedMethod()メソッドが呼び出されます。 このメソッドの本体を変更すると、ブラウザの変更はページをリロードしないと適用されません。 つまり、たとえば、このボタンがあるアプリケーションを起動した場合、「変更可能なテキスト」というテキストを「変更可能なテキスト2」に変更してボタンを押すと、「変更可能なテキスト」というメッセージが表示されます。 ブラウザでページを更新すると、変更が適用されます。



その理由は、ホットスワップクラス(アプリケーションを再起動せずに「ホット」コードを置換する技術)を更新すると動作せず、変更されたクラスをロードしないため、小さな変更が発生しないためです。



ただし、機能するホットスワップの拡張された「実装」があります-Dynamic Code Evolution VM(以降DCEVM)、変更されたクラスをロードする機能のためのJRE HotSpotの変更。 JREが提供する単純なホットスワップとは異なります(そして、何らかの理由でIDEAで機能しません)-メソッドの本体だけでなく、そのシグネチャも変更でき、クラス内のメソッドを削除/追加して階層を変更できますクラス。 クラスを削除または追加することはできません。 ssw.jku.at/Research/Papers/Wuerthinger10a/Wuerthinger10a.pdf



一般に、IDEAにはDCEVMプラグインがありますが、JREのみが含まれており、次の2つの理由で機能しません。

1)IDEAでGWTプラグインを実行するには、起動するJREを指定できません-プロジェクトのJDKの下で起動されます。

2)JavaアプリケーションのようにDevModeを実行し、DCREM JRE(プラグインのインストール後にこのJREのみが表示されます)を明示的に伝えると、Swingを開始できないため、DevModeは開始されません。 明らかに、このJREはSwingでは機能しません。



元のバージョンは次のとおりです。

ssw.jku.at/dcevm

しかし、それは3年間サポートされておらず、Java 7および8では動作しないため、これが修正されたフォークがあります。

github.com/dcevm/dcevm

ここからダウンロード: dcevm.github.io



Java 7アップデート51、ビルド3のフルバージョンを使用しました。



開発が行われるJDKにインストールする必要があります-プロジェクト設定に示されています。 JDKに入れてください。 それからGWTプラグインが起動され、将来的にはすべてのプロジェクトで機能します。 [DCEVMに置き換え]ボタンをクリックしてインストールします。



win 7 x64で動作するOracle HotSpot JDK 1.7.0_67 x32をインストールしました。



そして、デバッグの下で通常通りGWTアプリケーションを起動します。 クラスを変更した後、Run-> Reload Changed Classesを実行し、コンパイル中にエラーがなければ、新しいクラスがロードされます(これは、イベントログウィンドウに表示されます-「<起動構成の名前>:1クラスがリロードされました」)。



一般的に、DCEVMはGWTだけでなく、ホットスワップが機能しないすべての場合に適しています。 そのため、他のプロジェクトで試すことができます。



GWT 2.7およびブラウザーのプラグインの放棄。


おそらくGWTは、DevModeとブラウザーのプラグインのサポートを放棄する予定です。FireFoxのGWTプラグインは最大26バージョンでのみ動作し、Chromeのプラグインは非常に遅いです。 したがって、FF 26で開発しています。



それを置き換えるために、SuperDevModeはすでに存在します( www.gwtproject.org/articles/superdevmode.html )。 つまり、開発モードでクライアント側のJavaコードを実行する代わりに、JavaコードをJSでコンパイルしてブラウザーにロードできます。 つまり JSは、実稼働環境と同様に実際に実行されます。 JSとJavaコードの相関は、ソースマップ(JSとこのJSでコンパイルされたコードの間のコード行を一致させるブラウザーのテクノロジー-GWTの場合はJavaコード)を使用して機能しますdeveloper.chrome.com/devtools/docs / javascript-debugging#source-maps



しかし、SuperDevModeモードでの開発の位置付けと実装は、実際の使用にはまだ適していません。 いくつかの非常に深刻な欠点があります。

1)これで、変更されたモジュールのコンパイルは、1つのクラスが変更されたか、複数のクラスが変更されたかに関係なく完了しました。 小さなモジュールの場合、これは問題ではありませんが、大きなモジュールの場合、コンパイルには5〜10分かかります。 そして、これはもちろん、順列やその他すべてを無効にするときです。

2)このコードのデバッグは異常です-IDEの通常のデバッグの代わりに、ブラウザ自体でデバッグJSを使用することをお勧めします。 例: geekbybit.blogspot.ru/2013/03/diy-working-with-gwt-codeserver-tomcat.html



GWT 2.7は最初のマイナスの修正について話します-彼らはインクリメンタルコンパイルを導入することを約束します。 blog.oio.de/2014/03/31/upcoming-gwt-releases-2-7-3-0-2014-beyond



IDEAの新しいバージョン(バージョン14以降はデフォルトで有効になります)は、私たちにとって嬉しい驚きです-SourceMaps docs.google.com/document/d/1Sf9lahq0jr0AsxR74ZE-Lntf0y5ZNk0104mhD8ozEuM/edit、youtrack.jetbrains.com/issとの連携WEB-4429#コメント= 27-620687

この方法はまだ粗雑ですが、これはほんの始まりに過ぎません。



そのため、将来的には、SuperDevModeで既に開発されます。これを利用して便利な開発のために多くのことが行われているからです。



PS問題の調査に協力してくれたJetBrainsのAndrey Dernovに感謝します。



All Articles