あるときからGoogle App Engine(Java)でgsonライブラリを使うと、java.lang.VerifyErrorが発生するようになってしまった。
別の方(GAE/JでGson利用時にjava.lang.VerifyErrorが発生する)」もとりあげているのと同じ現象のようですが、一応対応がわかったのでメモしておく。該当のコードを見るとnew Gson()のところで発生しているらしい。
ローカルの開発環境では再現せず、デプロイ先でだけ発生するのが困ったところ。
2013-03-27 15:48:58.984 Error for /main java.lang.VerifyError: Cannot inherit from final class at com.google.appengine.runtime.Request.process-914eb81ff215d801(Request.java) at java.lang.ClassLoader.defineClass1(Native Method) at java.lang.ClassLoader.defineClass(ClassLoader.java:634) at java.security.SecureClassLoader.defineClass(SecureClassLoader.java:142) at java.net.URLClassLoader.defineClass(URLClassLoader.java:277) at sun.reflect.GeneratedMethodAccessor5.invoke(Unknown Source) at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) at java.lang.reflect.Method.invoke(Method.java:616) at java.lang.ClassLoader.loadClass(ClassLoader.java:266) at jp.co.example.MainServlet(MainServlet.java:82
使っている環境は Google App Engine 1.7.5, Java SDK6、
Slim3 1.0.16, そして Gson 2.2.1。Javaは5も7もだめだった。
何度デプロイし直してもだめで、一時ファイルなどキャッシュになってそうな箇所を
片っ端から一旦クリアしてもやっぱりVerifyError。
色々試行錯誤した結果、原因は不明だけど、
次の方法でエラーなしに動作することがわかった。
-
Gson2.2.1のコンパイル済のjarでなく、ソース(gson-2.2.1-source.jar)を展開してプロジェクトソースに組み込む。
-
Gsonのバージョン1.7.1を入れる(2.2.1から1.7.1にバージョンを落とす)。
ソースを組み込むのは嫌だったので、後者で対応して解決とすることとした。