最近mac os marvericksにoracle jdk1.8をインストールしました。
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を指定して下さい。
これら設定ですが・・・
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」から確認できます。
あ、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/...
http://wiki.eclipse.org/Eclipse.ini#-vm_value:_Mac_OS_X_Example
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.
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を確認する
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 |