文系プログラマによるTIPSブログ

文系プログラマ脳の私が開発現場で学んだ事やプログラミングのTIPSをまとめています。

macのIntelliJ IDEAでJDK1.8を入れた後にplay1.2が動かない場合の対処

私は以下のサイトをGoogleAppEngine for javaの上でPlay framework1.2を載せて開発しています。

play2系だとGAE/Jに対応していないので動かないのですが、play1系だと実はGAE/Jに対応しているので、動くのです。しかしdatastoreの管理画面が開かなかったり、ちょっと不具合はあるんですけどね。

今回JDKをバージョン1.8にアップグレードしたところ、1.7の時に動いていたactionが突如おかしくなり、以下のエラーが起きるようになりました。全てのURLでこのエラーが起きるので、全く何も出来ない状態になりました。


f:id:treeapps:20170829002500p:plain

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に対応してねーぞ!と言われる件がありました。

今回もそれに近い現象なのですかね。解りません。。


まあとりあえず動いたのでこれでよし、と。