GWT2.5.1 on Super Dev Mode を今さらながら
GWT2.5はDevModeからSuperDevModeへの過渡期のもの(当時SuperDevModeはまだdraft的な扱いだったはず)なので、起動方法がちょっとこなれていません。
起動できるようになるまでにつまづきまくってしまったので、手順を記録しておきます (なお、聞くところによると2.6でもまた別のひっかかりポイントがあるとかないとか…)。
使用するソースコードはこちらです:
github.com/yukihane/hello-mvp4g/ (tag: tag/blog/20151024/super-dev-mode)
(別の用途で使用するために作成したリポジトリなので、名前は気にしないでください…)
初期コードのgreetingメソッド引数をString型から別のSerializableな独自型に変更したものになります。
ローカルに展開したらmainディレクトリに移動してください。
以下の手順で実行すればSuper Dev Modeで操作できるように成ります。
- (前述の通り)カレントディレクトリを
main
に移します - 次のコマンドを実行し、コードサーバを起動します。
mvn clean process-classes gwt:run-codeserver
- コードサーバが起動したら、指示される通りブラウザで http://localhost:9876/ を開きます。
- これまた指示される通り、2つのブックマークレットをブックマークバーに登録しておきます。
- モジュール名(今回はMainModule)のリンクが表示されますのでそのページヘ飛びます。
- .gwt.rpcという拡張子のファイルリンクがあると思いますので、リンク先を保存します。今回は1ファイルのみです。
- 保存したファイルを target/main-0.0.1-SNAPSHOT/MainModule/ へ移動させます。
- 次のコマンドを実行し、webサーバーを起動します。
mvn gwt:run
- アラートダイアログでコンパイルを促されると思いますので、先ほど登録したブックマークレット"Dev Mode On"を押しコンパイルを実行します。
少し補足をしておきます。
コードサーバ起動前に明示的に
mvn process-classes
を実行しなければならないのはver.2.5特有のバグだそうで、2.6(or 2.6.1?)で修正されたそうです。
[INFO] [ERROR] Errors in 'file:/home/yuki/programs/hello-mvp4g/main/src/main/java/com/github/yukihane/hello_mvp4g/client/MainModule.java'
[INFO] [ERROR] Line 37: No source code is available for type com.github.yukihane.hello_mvp4g.client.GreetingServiceAsync; did you forget to inherit a required module?
[INFO] [ERROR] Line 39: No source code is available for type com.github.yukihane.hello_mvp4g.client.Messages; did you forget to inherit a required module?
[INFO] [ERROR] Unable to find type 'com.github.yukihane.hello_mvp4g.client.MainModule'
[INFO] [ERROR] Hint: Previous compiler errors may have made this type unavailable
[INFO] [ERROR] Hint: Check the inheritance chain from your module; it may not be inheriting a required module or a module may not be adding its source path entries properly
[INFO] [ERROR] Compiler returned false
また、gwt.rpcファイルを自身でダウンロードしdeploy無ければならないのも、後続のバージョンでは不要になっているらしいですので2.5特有の手順ということになります。
これを行わない場合、次のような例外が発生(Jettyのログに出力されます)し、GWT-RPCが行えません。
00:00:56.715 [WARN] greetServlet: An IncompatibleRemoteServiceException was thrown while processing this call.
com.google.gwt.user.client.rpc.IncompatibleRemoteServiceException: Type 'com.github.yukihane.hello_mvp4g.shared.Information' was not assignable to 'com.google.gwt.user.client.rpc.IsSerializable' and did not have a custom field serializer. For security purposes, this type will not be deserialized.
at com.google.gwt.user.server.rpc.RPC.decodeRequest(RPC.java:323)
at com.google.gwt.user.server.rpc.RemoteServiceServlet.processCall(RemoteServiceServlet.java:206)
at com.google.gwt.user.server.rpc.RemoteServiceServlet.processPost(RemoteServiceServlet.java:248)
at com.google.gwt.user.server.rpc.AbstractRemoteServiceServlet.doPost(AbstractRemoteServiceServlet.java:62)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:637)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:717)
at org.mortbay.jetty.servlet.ServletHolder.handle(ServletHolder.java:487)
at org.mortbay.jetty.servlet.ServletHandler.handle(ServletHandler.java:362)
at org.mortbay.jetty.security.SecurityHandler.handle(SecurityHandler.java:216)
at org.mortbay.jetty.servlet.SessionHandler.handle(SessionHandler.java:181)
at org.mortbay.jetty.handler.ContextHandler.handle(ContextHandler.java:729)
at org.mortbay.jetty.webapp.WebAppContext.handle(WebAppContext.java:405)
at org.mortbay.jetty.handler.HandlerWrapper.handle(HandlerWrapper.java:152)
at org.mortbay.jetty.handler.RequestLogHandler.handle(RequestLogHandler.java:49)
at org.mortbay.jetty.handler.HandlerWrapper.handle(HandlerWrapper.java:152)
at org.mortbay.jetty.Server.handle(Server.java:324)
at org.mortbay.jetty.HttpConnection.handleRequest(HttpConnection.java:505)
at org.mortbay.jetty.HttpConnection$RequestHandler.content(HttpConnection.java:843)
at org.mortbay.jetty.HttpParser.parseNext(HttpParser.java:647)
at org.mortbay.jetty.HttpParser.parseAvailable(HttpParser.java:211)
at org.mortbay.jetty.HttpConnection.handle(HttpConnection.java:380)
at org.mortbay.io.nio.SelectChannelEndPoint.run(SelectChannelEndPoint.java:395)
at org.mortbay.thread.QueuedThreadPool$PoolThread.run(QueuedThreadPool.java:488)
Caused by: com.google.gwt.user.client.rpc.SerializationException: Type 'com.github.yukihane.hello_mvp4g.shared.Information' was not assignable to 'com.google.gwt.user.client.rpc.IsSerializable' and did not have a custom field serializer. For security purposes, this type will not be deserialized.
at com.google.gwt.user.server.rpc.impl.LegacySerializationPolicy.validateDeserialize(LegacySerializationPolicy.java:127)
at com.google.gwt.user.server.rpc.impl.ServerSerializationStreamReader.deserialize(ServerSerializationStreamReader.java:651)
at com.google.gwt.user.server.rpc.impl.ServerSerializationStreamReader.readObject(ServerSerializationStreamReader.java:567)
at com.google.gwt.user.server.rpc.impl.ServerSerializationStreamReader$ValueReader$8.readValue(ServerSerializationStreamReader.java:140)
at com.google.gwt.user.server.rpc.impl.ServerSerializationStreamReader.deserializeValue(ServerSerializationStreamReader.java:425)
at com.google.gwt.user.server.rpc.RPC.decodeRequest(RPC.java:312)
at com.google.gwt.user.server.rpc.RemoteServiceServlet.processCall(RemoteServiceServlet.java:206)
at com.google.gwt.user.server.rpc.RemoteServiceServlet.processPost(RemoteServiceServlet.java:248)
at com.google.gwt.user.server.rpc.AbstractRemoteServiceServlet.doPost(AbstractRemoteServiceServlet.java:62)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:637)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:717)
at org.mortbay.jetty.servlet.ServletHolder.handle(ServletHolder.java:487)
at org.mortbay.jetty.servlet.ServletHandler.handle(ServletHandler.java:362)
at org.mortbay.jetty.security.SecurityHandler.handle(SecurityHandler.java:216)
at org.mortbay.jetty.servlet.SessionHandler.handle(SessionHandler.java:181)
at org.mortbay.jetty.handler.ContextHandler.handle(ContextHandler.java:729)
at org.mortbay.jetty.webapp.WebAppContext.handle(WebAppContext.java:405)
at org.mortbay.jetty.handler.HandlerWrapper.handle(HandlerWrapper.java:152)
at org.mortbay.jetty.handler.RequestLogHandler.handle(RequestLogHandler.java:49)
at org.mortbay.jetty.handler.HandlerWrapper.handle(HandlerWrapper.java:152)
at org.mortbay.jetty.Server.handle(Server.java:324)
at org.mortbay.jetty.HttpConnection.handleRequest(HttpConnection.java:505)
at org.mortbay.jetty.HttpConnection$RequestHandler.content(HttpConnection.java:843)
at org.mortbay.jetty.HttpParser.parseNext(HttpParser.java:647)
at org.mortbay.jetty.HttpParser.parseAvailable(HttpParser.java:211)
at org.mortbay.jetty.HttpConnection.handle(HttpConnection.java:380)
at org.mortbay.io.nio.SelectChannelEndPoint.run(SelectChannelEndPoint.java:395)
at org.mortbay.thread.QueuedThreadPool$PoolThread.run(QueuedThreadPool.java:488)
参考:
最近のコメント