Google App Engine のデプロイで苦労した話

投稿日 : 2015.3.13

GoogleAppEngineはjspファイルを含んでいる場合、デプロイが失敗することがある、ということはググれば結構出てくるが、それでもはまったのでメモを残す。

 

java.lang.RuntimeException: Cannot get the System Java Compiler. Please use a JDK, not a JRE.

というエラーメッセージが出てくるときは、原因として環境要因(eclipse.iniでjdkを指定していなかった)とソースファイル要因(jspコンパイルエラー、でもローカルサーバで実行時は普通に動く)が考えられる。

 

●環境要因の解決法 参考:GAE−JSPがあるとデプロイが失敗する件 - sabonightの日記

Javaはjdk7以下を使うこと。GAEがまだ8に対応してないからUnsupportedClassVersionErrorが出る (2015.3.13)

eclipse.ini に以下のコードを追加

-vm 
C:\Program Files\Java\jdk1.7.0_75\bin\javaw.exe(jdkに含まれるjavaw.exeへのパス)

-vmargs
-Dosgi.requiredJavaVersion=1.7
環境変数パスの java_homeをjdk7のものに(C:\Program Files\Java\jdk1.7.0_75\ など)、変数pathの最初に%java_home%\binを移動

ソースファイル要因の解決法 参考:Issue 8725 - googleappengine - Failed to deplay - Google App Engine - Google Project Hosting

jspファイルからすべてimport文を除外。クラス名はすべて完全修飾クラス名で書く。

jspのinclude元・include先で変数名の衝突が起こらないようにする。例えば、多くのjspファイルから参照される、ページレイアウトを定義したjspファイルなどは変数名を冗長にしておく。

 

環境要因とソースファイル要因を切り分けるためには?

 まず、(GooglePlugInを利用するなどして)jspを含まない新規GAEプロジェクトを作成し、デプロイを試す。これは成功するはず。

 次に、warファイルに単純なjspファイルを作成(ファイル内でjavaが使われていなくてもいい。Eclipseなら、PackageExplorerでwarフォルダを右クリック -> New -> Other... -> Web -> JSP File で作成したデフォルトのJSPファイルで十分)。デプロイを試す。失敗したら環境要因を修正する必要がある。成功すれば環境要因はクリア。デプロイしようとしているプロジェクトに含まれるJSPファイルに問題があることになる。

 

-------------------------------------------------------------------------------------------

以下経緯。反面教師。

 

エラーメッセージ-----------------

Preparing to deploy:
Created staging directory at: 'R:\Temp\appcfg6583028287260996029.tmp'
Scanning for jsp files.
Compiling jsp files.
java.lang.RuntimeException: Cannot get the System Java Compiler. Please
use a JDK, not a JRE.

Debugging information may be found in
R:\Temp\appengine-deploy8586597779396298325.log

----------------------------------------
JREじゃなくてJDKを使えって書いてあるけど、ちゃんとそのように指定した。
 → eclipse.iniの-vm に jdk7を指定(jdk 6
32bitも試した)参考:https://groups.google.com/forum/#!topic/google-app-engine-japan/ymbsf-1Mf4I

 ⇒ だめ


 appcfg.cmdを使うとシステムのJDKを取得できる 参考:http://qiita.com/MOKYN/items/cec526f981f1daba6afb

Googleアカウントにログインするときに、普通のパスワード入力だと試行ブロックに引っかかり、その後ログインできなくなった。--oauth2 パラメータを利用することで解決)⇒ だめ

 実はJSPコンパイルエラー 参考:https://code.google.com/p/googleappengine/issues/detail?id=8725

 プリコンパイルのできるJSPページを追加してアクセス(slim3を使っていたので、FrontServletによるリダイレクトは解除しないとエラーでるようだ)、.jspファイルからすべてimport文を除外(アップロード用コンパイラはローカルサーバ用コンパイラよりも繊細なためエラーが出るとか) ⇒ だめ

↓ 

環境(java version?)かプロジェクト(JSP?)かの切り分けをためしてみる
 初期プロジェクトデプロイ : 成功
 index.jspを追加(jspにはjavaコードすら書かれていない): 失敗

eclipse.iniを修正
-vm (半角スペース)(改行)
javawへのパス(/区切り)
とすればよいらしい

 ⇒ 初期プロジェクト+jspファイル : 成功
 ⇒ でもメインのプロジェクトはだめ

jspファイル間のローカル変数の衝突をさけるため、レイアウト関連jspはファイル名を変数名の先頭につけてみる

 ⇒ エラーログが変わった
前:java.lang.RuntimeException: Cannot get the System Java
Compiler. Please use a JDK, not a JRE.(実際はjspのプリコンパイルエラー)
後: com.google.apphosting.utils.config.AppEngineConfigException:
Received SAXException parsing the input stream

web.xmlは日本語コメント使えない 参考:psycho cafe: gaeのweb.xmlでは日本語コメントが使えない

 ⇒デプロイ成功!

  でも、jspが動作しないようだ。java8でjspコンパイルしたが、gaeはjava7までしか対応していないため、「ava.lang.UnsupportedClassVersionError:
クラス名 (Unsupported major.minor version
Mj.Mi)」の例外が発生。環境変数pathを書き換え(pathの値は最初の方から順番に評価されるようだ。最初が「C:\ProgramData\Oracle\Java\javapath」だったため、java8でコンパイルされたのかも。
 参考:Javaアプリケーション メモ(Hishidama's Java-Application Memo)

  ⇒ 完全にデプロイ成功