さまざまな開発者向けに Web アプリをデプロイするとき、および Amazon の EC2 で同様の構成要件がありました。構成をバイナリ コードから分離するにはどうすればよいでしょうか? 私の経験では、JNDI は複雑すぎて、使用するコンテナによって大きく異なります。また、手作業で編集する XML は構文エラーの影響を非常に受けやすいため、このアイデアは破棄されました。いくつかのルールに基づいた設計でこれを解決しました。
1) 単純な name=value エントリのみを使用する必要があります
2) パラメータを 1 つだけ変更するだけで、新しい構成をロードできるようにする必要があります。
3) WAR バイナリは、再パッケージ化せずに再構成可能である必要があります。
4) 機密パラメータ (パスワード) はバイナリにパッケージ化されません
すべての構成に .properties ファイルを使用System.getProperty("domain");
し、適切なプロパティ ファイルをロードするために使用することで、要件を満たすことができました。ただし、システム プロパティはファイル URL を指していません。代わりに、使用する構成を指定するために「ドメイン」と呼ばれる概念を作成しました。構成の場所は常に次のとおり
$HOME/appName/config/$DOMAIN.properties
です。
したがって、独自の構成を使用してアプリを実行する場合は、ドメインを自分の名前に設定してアプリを
-Ddomain=jason
起動します。起動時にアプリがファイルをロードします。
/home/jason/appName/config/jason.properties
これにより、開発者は構成を共有できるため、アプリの同じ状態を再現できます。再コンパイルや再パッケージを行わずにテストと展開を行うことができます。次に、ドメイン値を使用して、バンドルされた WAR の外部の標準の場所から .properties をロードします。
次のような運用構成を使用して、ワークステーションで運用環境を完全に再作成でき
-Ddomain=ec2
ます。
/home/jason/appName/config/ec2.properties
この設定により、各環境で異なる構成を使用して、正確に 1 つのコンパイル済みバイナリ セットで開発/QA/リリース サイクルを実行できます。バイナリにパスワードなどをバンドルするリスクはなく、人々は構成を共有して、私たちが見ている問題を再現できます。