デプロイメントインスタンスに基づいて定数を変更する方法
-
18-09-2019 - |
質問
Eclipseプラグインを使用してGWT 1.7 + GAEアプリケーションを構築しています。システム定数は、...gwt.i18n.client.Constants クラスを拡張するシングルトン MyConstants クラスによってロードされる MyConstants.properties ファイルにロードされます。
MyConstants が次のような設定を含むいくつかのファイルの 1 つをロードしたいと考えています。
- MyConstants-local.properties
- MyConstants-alpha.properties
- MyConstants-beta.properties
- MyConstants-prod.properties
Guice の Enum Stage への参照をいくつか見つけましたが、これは gin ではサポートされていないようです。さらに、開発/製品のみを処理するため、ローカル/ベータ/製品ソリューションが必ず必要です。
コマンドライン引数またはGAEにロードされたときに機能する他のインスタンス定義のランタイムパラメータを使用してこれを行う方法はありますか?
解決
GAEサーバ側では、私は、コードのこれらのビットを持つ任意の展開本番環境から私のdevの環境を区別することができました。
1つのインターフェースと2つのクラスファイルを作成します。
public interface MyConstants {
public String myConstant();
}
public class MyConstantsDev implements MyConstants {
public String myConstant() { return "xyzzy-dev"; };
}
public class MyConstantsProd implements MyConstants {
public String myConstant() { return "xyzzy-prod"; };
}
「はuser.dir」のenv VARを用いた結合のGuiceの魔法のビットを定義します。 user.dirパス内の最後のディレクトリには、一意のGoogle App Engineのアプリケーション識別子またはあなたのルートプロジェクト開発ディレクトリのいずれかです。あなたがこれを知ったら、あなたが使用する定数のセットを決定することができます。
public class MyServerModule extends com.google.inject.AbstractModule {
String appIdentifier = new File( System.getProperty("user.dir") ).getName();
if ( appIdentifier.equals("trunk") ) {
// Load MyConstants-dev.properties
bind( MyConstants.class ).to( MyConstantsDev.class ).in(Singleton.class);
} else {
// Load MyConstants-prod.properties
bind( MyConstants.class ).to( MyConstantsProd.class ).in(Singleton.class);
}
}
これは私はこのようなクラスにDEV / PROD定数を注入することができます:
public class MyDomainClass {
@Inject
public MyDomainClass( Logger logger, MyConstants const ) {
logger.debug( const.myConstant() );
};
}
他のヒント
あなたはこれを動作するように特に作られたタイプセーフなインターフェースを使用する必要があります...
if (SystemProperty.environment.value() == SystemProperty.Environment.Value.Production)
{
//It's production.
}
else
{
//It's Dev - and (SystemProperty.environment.value() == SystemProperty.Environment.Value.Development)
}
開発と展開環境の間で違うの一つは、SERVER_SOFTWARE
環境変数です。
if (System.getenv("SERVER_SOFTWARE").startsWith("Dev")) {
// Load MyConstants-dev.properties
} else {
// Load MyConstants-prod.properties
}
たぶん、あなたはそれのオフに基づいて負荷にどのGuiceのモジュールを選ぶことができます。
GAEの SERVER_SOFTWARE の変数を取得するための上記の回答では、 SERVER_SOFTWARE環境変数は、したがって、そのWebサーバの設定CGIのデフォルトであり、システム環境VARSを介してアクセス可能ではなく、するServletContextから入手可能です。
ここにあなたが必要とするあなたの値を取得する必要がありますコードです(ノーアイデアなぜそのServerInfoなくServerSoftware ...):
if (getServletContext().getServerInfo().startsWith("Dev")) {
// Load MyConstants-dev.properties
} else {
// Load MyConstants-prod.properties
}