開発サーバの起動引数メモ

GAE/Jの開発サーバの起動引数とappengine-web.xmlに関して、ちょっとはまっていたのでメモしておきます。

GAE/Jの開発サーバは、 com.google.appengine.tools.development.DevAppServerMain をエントリーポイントとします。これは通常のエントリーポイントの実行ですから、Javaの実行オプションを指定することができます。一方、プロダクションサーバではエントリーポイントや起動方法については開発者は触ることができません。しかし、起動引数については、appengine-web.xmlにて指定する事が可能です。

<?xml version="1.0" encoding="utf-8"?>
<appengine-web-app xmlns="http://appengine.google.com/ns/1.0">
  <system-properties>
    <property name="etupirkacms.debug" value="true" />
    <property name="java.util.logging.config.file" value="WEB-INF/classes/logging.properties" />
    <property name="slim3.hotReloading" value="true" />
  </system-properties>
</appengine-web-app>

system-propertiesの部分が起動オプションと見なされるので、次のように起動オプションを指定する事と概ね一緒です。

java
-Detupirkacms.debug=true
-Djava.util.logging.config.file=WEB-INF/classes/logging.properties
-Dslim3.hotReloading=true
com.google.appengine.tools.development.DevAppServerMai

値はSystem.getPropertyで取得できます。

System.getProperty("etupirkacms.debug");  // => true
System.getProperty("java.util.logging.config.file");  // => WEB-INF/classes/logging.properties
System.getProperty("slim3.hotReloading");  // => true

したがって、次のように起動オプションを指定すれば、開発サーバでのログを指定できます。

java
-Djava.util.logging.config.file=WEB-INF/classes/logging-dev.properties
com.google.appengine.tools.development.DevAppServerMai

ここまでの経験より、「appengine-web.xmlより起動オプションが優先される」と思い込んでいたのですが、実は逆だったというのが今回の話です。

java
-Detupirkacms.debug=false
-Djava.util.logging.config.file=WEB-INF/classes/logging-dev.properties
-Dslim3.hotReloading=false
com.google.appengine.tools.development.DevAppServerMai

として起動すると次のようになります。

System.getProperty("etupirkacms.debug");  // => true
System.getProperty("java.util.logging.config.file");  // => WEB-INF/classes/logging.properties
System.getProperty("slim3.hotReloading");  // => true

実は、loggingのみは起動引数に指定するとそれが有効になりますが、それ以外のオプションは上書きされてしまうのです。
したがって、開発サーバの起動時にオプションの指定でappengine-web.xmlの一部を書き換えることはできません。ご注意ください

追加メモ

実装は com.google.appengine.tools.development.AbstractContainerService#setSystemPropertiesあたりを参照。