GAE/Jでgsonを使うとVerifyErrorになる件(解決?)

あるときから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にバージョンを落とす)。

ソースを組み込むのは嫌だったので、後者で対応して解決とすることとした。