私は以下のサイトをGoogleAppEngine for javaの上でPlay framework1.2を載せて開発しています。
play2系だとGAE/Jに対応していないので動かないのですが、play1系だと実はGAE/Jに対応しているので、動くのです。しかしdatastoreの管理画面が開かなかったり、ちょっと不具合はあるんですけどね。
今回JDKをバージョン1.8にアップグレードしたところ、1.7の時に動いていたactionが突如おかしくなり、以下のエラーが起きるようになりました。全てのURLでこのエラーが起きるので、全く何も出来ない状態になりました。
22:22:45,686 ERROR ~ @6jn8gka4k Internal Server Error (500) for request GET / Oops: UnexpectedException An unexpected error occured caused by exception UnexpectedException: While applying class play.classloading.enhancers.ContinuationEnhancer on helpers.CheatSheetHelper$2 play.exceptions.UnexpectedException: While applying play.CorePlugin@27c6e487 on helpers.CheatSheetHelper$2 at play.plugins.PluginCollection.enhance(PluginCollection.java:556) at play.classloading.ApplicationClasses$ApplicationClass.enhance(ApplicationClasses.java:235) at play.classloading.ApplicationClassloader.loadApplicationClass(ApplicationClassloader.java:167) at play.classloading.ApplicationClassloader.getAllClasses(ApplicationClassloader.java:431) at play.Play.start(Play.java:516) at play.Play.detectChanges(Play.java:630) at play.Invoker$Invocation.init(Invoker.java:198) at Invocation.HTTP Request(Play!) Caused by: play.exceptions.UnexpectedException: While applying class play.classloading.enhancers.ContinuationEnhancer on helpers.CheatSheetHelper$2 at play.CorePlugin.enhance(CorePlugin.java:302) at play.plugins.PluginCollection.enhance(PluginCollection.java:551) ... 7 more Caused by: java.lang.RuntimeException: java.io.IOException: invalid constant type: 18 at javassist.CtClassType.getClassFile2(CtClassType.java:203) at javassist.CtClassType.subtypeOf(CtClassType.java:303) at javassist.CtClassType.subtypeOf(CtClassType.java:318) at play.classloading.enhancers.ContinuationEnhancer.enhanceThisClass(ContinuationEnhancer.java:49) at play.CorePlugin.enhance(CorePlugin.java:297) ... 8 more Caused by: java.io.IOException: invalid constant type: 18 at javassist.bytecode.ConstPool.readOne(ConstPool.java:1027) at javassist.bytecode.ConstPool.read(ConstPool.java:970) at javassist.bytecode.ConstPool.<init>(ConstPool.java:127) at javassist.bytecode.ClassFile.read(ClassFile.java:693) at javassist.bytecode.ClassFile.<init>(ClassFile.java:85) at javassist.CtClassType.getClassFile2(CtClassType.java:190) ... 12 more
どうも調べてみると、play1.2はjavassistを使ってbyteコードを直接いじっているところがあり、javassistがjdk1.8に対応していないためにエラーになっているようなのです。
ふーん、そっすか、と思いつつInttelij IDEA13でプロジェクトの設定をjdk1.7に戻してみたのですが、これがどうも反映されない。
プロジェクトのjdk設定を1.7に指定してもだめ。
javaassitを最新版に変更してもだめ。
キャッシュをクリアしてもだめ。
もうだめだめだめ。
しかしふとOSのパス上のjdkの1.8から1.7に変更したら動いた!のです。
変更前
treemacpro-6:local tree$ java -version Picked up _JAVA_OPTIONS: -Dfile.encoding=UTF-8 java version "1.8.0_11" Java(TM) SE Runtime Environment (build 1.8.0_11-b12) Java HotSpot(TM) 64-Bit Server VM (build 25.11-b03, mixed mode)
変更後
treemacpro-6:local tree$ java -version Picked up _JAVA_OPTIONS: -Dfile.encoding=UTF-8 java version "1.7.0_21" Java(TM) SE Runtime Environment (build 1.7.0_21-b12) Java HotSpot(TM) 64-Bit Server VM (build 23.21-b01, mixed mode)
なんか解りませんが、これで直りました。。。
プロジェクトは確かにJDK1.7を指定してるのに、なんで1.8でコンパイルしようとしてるのか、ちょっと解りませんでした。。。intellijの事をまだ解ってないだけなのでしょうかね。
以前以下の記事を書いたのですが、この時はコンパイルはjdk1.7でするよう指定してるのに、jspだけjdk1.8に対応してねーぞ!と言われる件がありました。
今回もそれに近い現象なのですかね。解りません。。
まあとりあえず動いたのでこれでよし、と。