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

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

JDK1.8インストール後にGAE/JでUnsupported major.minor version 52.0が起きる問題

最近mac os marvericksにoracle jdk1.8をインストールしました。


f:id:treeapps:20160521191008p:plain

jdk1.8インストール後にGAE/Jのデプロイを行ったところ、以下の現象が起きました。

  • ローカルでは全く問題なく動作する。
  • デプロイすると、エラーが起きて画面が全く表示できない。
  • eclipseのjavaコンパイラは1.7を指定している。

エラーの内容は以下の通りです。

Failed startup of context com.google.apphosting.utils.jetty.RuntimeAppEngineWebAppContext@1f10330{/,/base/data/home/apps/s~tree-tips/1.377679853321327247}
org.mortbay.util.MultiException[
java.lang.UnsupportedClassVersionError: org/apache/jsp/view/affiliate/amazon_005fproduct_005fadvertising_005fapi_jsp : Unsupported major.minor version 52.0, 
java.lang.UnsupportedClassVersionError: org/apache/jsp/view/affiliate/index_jsp : Unsupported major.minor version 52.0, 
java.lang.UnsupportedClassVersionError: org/apache/jsp/view/common/advertise/amazon/_160x600_jsp : Unsupported major.minor version 52.0, 
java.lang.UnsupportedClassVersionError: org/apache/jsp/view/common/advertise/amazon/_728_005fmysql_jsp : Unsupported major.minor version 52.0, 
・・・

このエラーをよーーーく見ると・・・

jspでしかエラーが起きてない!

事が解りました。
javaファイルではエラーが起きておらず、jspのみエラーが発生しているようです。

解決策

javaのコンパイラレベルを1.7にする。

以下がjdk1.7が設定されていなければ、1.7を指定して下さい。
f:id:treeapps:20140802173845p:plain
f:id:treeapps:20140802173932p:plain

これら設定ですが・・・

javaのコンパイラレベルの指定であってjspの指定は含まれてないっぽい

のです。
ではjspのコンパイラレベルは何で決まるのか。

どうも調べてみると、

eclipse自体の起動vmのバージョンに依存している

挙動である事が解りました。
つまり、プロジェクトのコンパイラレベルを1.7にしても、eclipse自体の起動vmが1.8になっていると、jspはjdk1.8でコンパイルされている、という事になるようです。

eclipse自体の起動vmをjdk1.7を指定する

eclipseのvmを確認する

まず、現在起動中のeclipseのvmバージョンを確認しましょう。
macの場合、Eclipse → 「Eclipse について」 → 「Installation Details」から確認できます。
f:id:treeapps:20140802174904p:plain


あ、jdk1.8になってる・・・

はい、アウトですね。
ではこれを1.7にしてみましょう。

macのjdkのパスを確認

treemacpro-3:JavaVirtualMachines tree$ pwd
/Library/Java/JavaVirtualMachines
treemacpro-3:JavaVirtualMachines tree$ ll
total 0
drwxr-xr-x  3 root  wheel   102B  2 24  2013 jdk1.7.0_15.jdk
drwxr-xr-x  3 root  wheel   102B  5 23  2013 jdk1.7.0_21.jdk
drwxr-xr-x  3 root  wheel   102B  7 28 22:07 jdk1.8.0_11.jdk

ここにインストールしたjdkが入っています。
マイナーバージョンもありますが、今回は「jdk1.7.0_21.jdk」を指定します。

ecllipse自体のvmの指定方法

On a Mac OS X system, you can find eclipse.ini by right-clicking (or Ctrl+click) on the Eclipse executable in Finder, choose Show Package Contents, and then locate eclipse.ini in the MacOS folder under Contents.

To specify Java 6 for OS X:

-vm
/System/Library/Frameworks/JavaVM.framework/Versions/1.6.0/Home/bin/java
For versions of Mac OS X 10.7+ the location has changed to

/Library/Java/JavaVirtualMachines/<''jdk_name_ver''>/Contents/Home/...
To be safer, determine the location for the JDK you intend to use via the utility /usr/libexec/java_home and put this value with .../bin/java appended into the Eclipse.ini file.

http://wiki.eclipse.org/Eclipse.ini#-vm_value:_Mac_OS_X_Example

eclipse.iniで指定できるよ!と書いています。
ではeclipse.iniはどこにあるか。macの場合はちょっと解り難いですが、以下にあります。

treemacpro-3:MacOS tree$ cd /Applications/eclipse/Eclipse.app/Contents/MacOS/
treemacpro-3:MacOS tree$ ll eclipse.ini
-rw-r--r--@ 1 tree  staff   644B  5  3  2013 eclipse.ini

「/Applications/eclipse」の部分はeclipseフォルダのパスに置き換えて下さい。
このeclipse.iniを修正します。

eclipse.iniにeclipse自体の起動vmを指定する設定を追加する

修正前のeclipse.iniは以下の通りです。これはeclipse LUNA(ver4.4)のものです。

-startup
../../../plugins/org.eclipse.equinox.launcher_1.3.0.v20140415-2008.jar
--launcher.library
../../../plugins/org.eclipse.equinox.launcher.cocoa.macosx.x86_64_1.1.200.v20140603-1326
-product
org.eclipse.epp.package.jee.product
--launcher.defaultAction
openFile
-showsplash
org.eclipse.platform
--launcher.XXMaxPermSize
256m
--launcher.defaultAction
openFile
--launcher.appendVmargs
-vmargs
-Dosgi.requiredJavaVersion=1.6
-XstartOnFirstThread
-Dorg.eclipse.swt.internal.carbon.smallFonts
-XX:MaxPermSize=256m
-Xms40m
-Xmx512m
-Xdock:icon=../Resources/Eclipse.icns
-XstartOnFirstThread
-Dorg.eclipse.swt.internal.carbon.smallFonts

これを以下のように、「-vmargsのすぐ上に-vmを追加」します。

-vm
/Library/Java/JavaVirtualMachines/jdk1.7.0_21.jdk/Contents/Home/jre/bin/java
-vmargs
-Dosgi.requiredJavaVersion=1.6

前述のwiki.eclipse.orgの説明ではjdk/bin/javaではなくjre/bin/javaを指定していたので、ここではjre/bin/javaを指定します。

これを保存して、eclipseを再起動しましょう。

再度eclipseのvmを確認する

f:id:treeapps:20140802180335p:plain


jdk1.7になったどー!

この状態でデプロイすると、jspも1.7でコンパイルされるので、デプロイ後に実行時エラーにならなくなります!

最終的な環境

比較的新しいものを色々入れているので、最終的な環境をメモっておきます。
こんな環境でも動いてるよ、という目安になるかと思います。

OS mac os marvericks
インストールされているjdk jdk1.7.0_15.jdk、jdk1.7.0_21.jdk、jdk1.8.0_11.jdk
コンパイル時のjdk /Library/Java/JavaVirtualMachines/jdk1.7.0_21.jdk
eclipse ver4.4 LUNA
gae for java
App Engine SDK ver1.9.7