LoginSignup
4

More than 5 years have passed since last update.

Google App Engine [Java] で異なる App ID 環境でソースファイルを使い回す方法

Posted at

こんにちは wezardnet です。今回は備忘録的な内容を書くことにします。

弊社内の某プロジェクトでは、テスト環境と本番環境を異なる App ID で分けています。テスト環境で動作確認して OK であれば本番環境にソースファイルを移すようにしています。このとき、以下のようなケースでコード内に自身の URL をベタ書きしていると、単純にソースファイルを移すことができません。

  • JavaScript, CSS や画像ファイルを参照している場合(相対パスが使えないガジェットなど)
  • Ajax などで Web サービスを呼び出している場合

動的ファイルの場合

動的に HTML を生成して出力している場合は Google App Engine API の SystemProperty を使って実行環境の App ID を取得することができるので URL の App ID 部分を置き換えるように実装すれば良いです。

また、開発環境(localhost)とプロダクション環境の判別は SystemProperty.environment によって分岐することができます。

 開発環境(localhost)の実行例
 dev.png

 プロダクション環境の実行例
 pro.png

上記、実行例のコードを示します。

EnvController.java
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} の部分は自身の環境に合わせて書き換えてください。

pom.xml
<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 ファイルを対象にしています。

pom.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}」と書きます。

dummy.xml
<?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 で記述した値に書き換わります。

他にも上手い方法があるかも知れませんが、実際に検証した方法を備忘録も兼ねて書きました。どこかで参考になればと思います。

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
4