こんにちは wezardnet です。今回は備忘録的な内容を書くことにします。
弊社内の某プロジェクトでは、テスト環境と本番環境を異なる App ID で分けています。テスト環境で動作確認して OK であれば本番環境にソースファイルを移すようにしています。このとき、以下のようなケースでコード内に自身の URL をベタ書きしていると、単純にソースファイルを移すことができません。
- JavaScript, CSS や画像ファイルを参照している場合(相対パスが使えないガジェットなど)
- Ajax などで Web サービスを呼び出している場合
動的ファイルの場合
動的に HTML を生成して出力している場合は Google App Engine API の SystemProperty を使って実行環境の App ID を取得することができるので URL の App ID 部分を置き換えるように実装すれば良いです。
また、開発環境(localhost)とプロダクション環境の判別は SystemProperty.environment によって分岐することができます。
上記、実行例のコードを示します。
import com.google.appengine.api.utils.SystemProperty ;
try ( PrintWriter writer = this.response.getWriter() ) {
writer.println("applicationId : " + SystemProperty.applicationId.get() + "<br />") ;
writer.println("applicationVersion : " + SystemProperty.applicationVersion.get() + "<br />") ;
writer.println("environment : " + SystemProperty.environment.value().toString() + "<br />") ;
writer.println("GAE Version : " + servletContext.getServerInfo() + "<br />") ;
writer.println("ContextPath : " + servletContext.getContextPath() + "<br />") ;
this.response.flushBuffer() ;
}
静的ファイルの場合
静的に配置する .xml や .js といったファイルの場合は Maven Resources Plugin を利用して、環境依存の値を置き換えることで実現できます。まずは pom.xml に置き換える文字列を定義します。以下 {App ID} と {App Version} の部分は自身の環境に合わせて書き換えてください。
<properties>
<appengine.app.name>{App ID}</appengine.app.name>
<appengine.app.version>{App Version}</appengine.app.version>
<appengine.target.version>1.9.38</appengine.target.version>
</properties>
次に置き換えるファイルの配置場所を指定します。下記の例は gadgets フォルダ配下の .xml ファイルを対象にしています。
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-war-plugin</artifactId>
<version>2.3</version>
<configuration>
<webResources>
<resource>
<directory>${basedir}/src/main/webapp/gadgets</directory>
<filtering>true</filtering>
<targetPath>gadgets</targetPath>
</resource>
</webResources>
</configuration>
</plugin>
ガジェット定義ファイル(.xml)の中で参照する自身の js ファイルのパスで App ID の部分は「${appengine.app.name}」と書きます。
<?xml version="1.0" encoding="UTF-8" ?>
<Module>
<ModulePrefs
title="ダミーガジェット"
height="100"
scrolling="false">
</ModulePrefs>
<Content type="html">
<![CDATA[
<html>
<head>
<script src="https://${appengine.app.name}.appspot.com/dummy.js"></script>
</head>
<body>
<p>これはダミーのガジェットです</p>
</body>
</html>
]]>
</Content>
</Module>
これでプロジェクトをビルドすれば dummy.xml ファイル内の「${appengine.app.name}」の部分が pom.xml で記述した値に書き換わります。
他にも上手い方法があるかも知れませんが、実際に検証した方法を備忘録も兼ねて書きました。どこかで参考になればと思います。