Google App Engine for Java SDKで開発をする 〜 Spring MVCでアプリを作成する

Google App Engine for Java SDKで開発をする 〜 プロジェクトの作成」では、「初めてのGAEプロジェクト」以来、実に3年ぶりにGAEプロジェクを作成した。

3年前はtwitterbotを作成して、GAE上にデプロイして動かしていた。今も動いているが、放置しっぱなしw。

さて、今回は、「EclipseにインストールしたSpring Test SuiteでSpringMVCプロジェクトを作成する」で紹介したのと同様に、Spring MVCで作成したアプリをGAEで作成してデプロイするところまでを目標とする。

1.とりあえずSpringで作成したコントローラをGAEにコピーする
もちろん、spring関連のjarが無いのでコンパイルエラーの嵐となる。

2.jarを追加する
GAEプロジェクトにはpomが無いので、war\WEB-INF\libにSpringプロジェクトで参照しているjar類を置く*1

また、バージョンは異なるが、下記も配置。

antlr-3.3-complete.jar
asm-3.3.1.jar
asm-commons-3.3.1.jar
commons-logging-1.1.1.jar

他にも色々配置する必要があったので、1つ1つ配置していきながらコンパイルエラーを解消。

3.クライアントサイドコンテンツを配置する
WEB-INF配下の資源を配置する。
元のSpring MVC+Tomcatで作成したプロジェクトのWEB-INF配下を、そのままGAEのプロジェクトにコピーする。

4.web.xmlの編集
Springプロジェクトのweb.xmlには、主に次の設定が記載されている。
・root-context.xml :コンテキストパラメータの定義ファイル
・DispatcherServlet :ディスパッチャーサーブレットの定義
servlet-context.xml :コンテキスト設定
これら(下記)をAppエンジンのweb.xmlに追加する。

<context-param>
    <param-name>contextConfigLocation</param-name>
    <param-value>/WEB-INF/spring/root-context.xml</param-value>
  </context-param>
  <listener>
    <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
  </listener>
  <servlet>
    <servlet-name>appServlet</servlet-name>
    <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
    <init-param>
      <param-name>contextConfigLocation</param-name>
      <param-value>/WEB-INF/spring/appServlet/servlet-context.xml</param-value>
    </init-param>
    <load-on-startup>1</load-on-startup>
  </servlet>
  <servlet-mapping>
    <servlet-name>appServlet</servlet-name>
    <url-pattern>/</url-pattern>
  </servlet-mapping>

特に問題なくGAEで動作した。
GAEに乗せる前にwebappフォルダに配置されていたものは、GAEではwarフォルダに配置することに注意すれば、jarの読み込みが面倒なことはあっても、Google App Engine SDKを使用した開発であっても特に詰まる作業は無かった。

ただ、「Appエンジンへデプロイ」する際に、「java-sdk-1.7.5でJSPが含まれるプロジェクトをデプロイできない」問題にぶち当たりました。ただ、これもGoogle Groupで提示されているとおりに、「eclipse.iniでVMを強制的にjdkに指定する」と解決した。

GAEは動作が遅いが、無事にAppエンジンへデプロイできた。
(ここからGAE上のサンプルアプリにアクセス可能)

*1:調べるとMavenでGAEプロジェクトを作成している人もいるので、可能なのだろうが、そこまでのモチベーションが無いので又の機会に。