開発サーバの起動引数メモ
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あたりを参照。