読者です 読者をやめる 読者になる 読者になる

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

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

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

java gae

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

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

  • ローカルでは全く問題なく動作する。
  • デプロイすると、エラーが起きて画面が全く表示できない。
  • eclipsejavaコンパイラは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を指定する

eclipsevmを確認する

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


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

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

macjdkのパスを確認

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を再起動しましょう。

再度eclipsevmを確認する

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

作ればわかる!Google App Engine for Javaプログラミング

作ればわかる!Google App Engine for Javaプログラミング

プログラミング Google App Engine

プログラミング Google App Engine

入門Ansible

入門Ansible