2009年10月16日金曜日

SDK1.2.6で開発サーバーが起動するようになった

SDK1.2.6で開発サーバーが起動しない問題の続き。

GAE/Jのグループの、SDK1.2.6でも新規に作成したプロジェクトだと問題なく開発サーバーが起動するという投稿を参考にして、新規にプロジェクトを作成した上で、これまでのリソースをコピーし、起動を試してみた。すると、起動するようになった!!やたっ!

[環境]
  • Eclipse : v3.4.2(Ganymade)
  • Google Plugin for Eclipse 3.4 : v1.1.2
  • Google App Engine Java SDK : v1.2.6
注意点は、ユニットテストをするためにappengine-api-stubs.jarとappengine-local-runtime.jarへクラスパスを通している場合。これら2つのjarに関しては、SDK1.2.5に同梱されていたものを使わないといけない。でないと、InvocationTargetExceptionが出て開発サーバーの起動に失敗する。
java.lang.reflect.InvocationTargetException
 at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
 at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
 at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
 at java.lang.reflect.Method.invoke(Method.java:597)
 at sun.instrument.InstrumentationImpl.loadClassAndStartAgent(InstrumentationImpl.java:323)
 at sun.instrument.InstrumentationImpl.loadClassAndCallPremain(InstrumentationImpl.java:338)
Caused by: java.lang.RuntimeException: Unable to find appengine-agentimpl.jar in hogehoge\war\WEB-INF\junitlib
 at com.google.appengine.tools.development.agent.AppEngineDevAgent.findAgentImplLib(AppEngineDevAgent.java:97)
 at com.google.appengine.tools.development.agent.AppEngineDevAgent.premain(AppEngineDevAgent.java:48)
 ... 6 more
FATAL ERROR in native method: processing of -javaagent failed
Exception in thread "main" 
要は、ユニットテストのために上記2つのjarをwar\WEB-INF\junitlibに入れ、クラスパスを通していたのだが(ユニットテストの環境設定についてはこちらにまとめています)、1.2.6に同梱されているバージョンのjarを使うと、クラスパスを通しているせいか、起動時にこのjunitlibの中に必要なjar(この場合はappengine-agentimpl.jar)を探しに行ってしまうのだ。

1.2.5同梱バージョンのものを使うと、InvocationTargetExceptionは表示されない。1.2.5のものではなくても、1.2.6のものでなければよいのではないかと思われ。

ちなみに自分の環境だと、-javaangentの指定をVM Argumentsに加えなくても起動します。この辺はEclipseのバージョンとGoogle Pluginのバージョンによるのかもしれません。 とりあえず、1.2.6に移行して上手く行かなくなった場合は、新規にプロジェクトを作り直してマージした方が話が早いということで。