App Engine java 1.3.6の新機能 app.yaml

1.3.7も出てしまっているけど、1.3.6で追加された機能の調査のつづき。app.yaml

app.yaml とは

JavaのApp Engineは基本的にサーブレットコンテナなので、サーブレットのお作法でいろいろなことをしなければならない。そのお作法の一つが、サーブレットクラスとURLのパスを結びつけるweb.xml
このファイルは、なんだかよくわからないほど冗長で非常に書きにくい。なにしろ、一つサーブレットを追加して、URLに割り当てるのに下のようにだいたい8行書かなければならない。これはXMLだから、というだけではなく、サーブレットクラス名とURLの他に「サーブレットの名前」という概念を導入しているから。概念的には整理されていていいのだが、面倒くさすぎる。

	<servlet>
		<servlet-name>new</servlet-name>
		<servlet-class>gaeTest.New</servlet-class>
	</servlet>
	<servlet-mapping>
		<servlet-name>new</servlet-name>
		<url-pattern>/new</url-pattern>
	</servlet-mapping>

さらに、appengine-web.xml というファイルもある。こちらには、アプリケーション名やらプロパティなどを定義しておく。eclipseを使っていると、プラグインが勝手に生成、管理してくれるので、直接このファイルを編集する機会はあまりないのだけど。

<?xml version="1.0" encoding="utf-8"?>
<appengine-web-app xmlns="http://appengine.google.com/ns/1.0">
  <application>demo</application>
  <version>2</version>
	
  <!-- Configure java.util.logging -->
  <system-properties>
     <property name="java.util.logging.config.file" value="WEB-INF/logging.properties"/>
  </system-properties>
</appengine-web-app>

で、この2つを簡単にyaml で書けるようにしたモノがapp.yamlだ。 こちらで書くと、上のサーブレット宣言のフラグメントはわずか3行。1行目は共有なので、サーブレットあたり2行で書ける。短くなるだけでなく、余計な概念が入らないのでわかりやすい。

handlers:
  - url: /new
     servlet: gaeTest.New

実装

実装的にはサーバ上でapp.yamlからweb.xml を生成して解釈しているようだ。
app.yamlでサポートされていない機能は、app.yaml内に直接XMLを書くことができる。おそらくweb.xmlを生成するときに直接埋め込んでるのだろう。

web_xml: |
  <error-page>
    <error-code>500</error-code>
    <location>/errors/servererror.jsp</location>
  </error-page>

注意点

たぶん、まだEclipseプラグインがサポートしていない。手元で試すとweb.xmlがない、といわれて開発サーバの起動もデプロイもできなかった。SDKのbin/appcfg.sh を使って

appcfg.sh update war

とやるとデプロイできる。
開発サーバは、

dev_appserver.sh war

で起動できる。

所感

実は、App Engine のpython 版では、もともとapp.yamlを使っているので、そちらにあわせたということでもある。
しかし、Eclipseプラグインとの連携はちょっと面倒かも知れない。app.yamlとweb.xmlが両方あったらどうするのか、プラグインからアプリケーション名やバージョン番号を変更したときにapp.yaml とappengine-web.xmlのどちらを更新するのか?などなどややこしい話がたくさん。
とはいえ、Eclipseプラグインで使えなかったら使い物にならない。

slim3のようなサーブレット上の別のフレームワークを使う場合にはそもそもweb.xmlをいじる必要がない。

なんか中途半端な機能として誰にも使われずに終わりそうな気がするなあ(-_-)。