4つの製品がある製品スイートに取り組んでいます。現在、すべての構成データはXMLファイルまたはプロパティファイルのいずれかにあります。異なる方法(本番環境、開発環境など)で異なる構成ファイルを管理する必要があるため、このアプローチは維持できません。
したがって、構成データを処理する最良の方法は何ですか?
また、これを別のモジュールにモジュール化できますか?すべての製品がこのモジュールを使用できるように。プロパティファイルは使用しません。すべての構成固有のコードを新しい構成モジュールとして移動し、すべての構成データをデータベースに保持できるソリューションを探しています。
commons-configuration を使用すると、プロパティにアクセスするための統一されたAPIがありますどのように表示されても-.properties、xml 、JNDIなど。例:
config.properties
:
jdbcHost=192.168.12.35
jdbcUsername=dbuser
jdbcPassword=pass
config.xml
:
<config>
<jdbcHost>192.168.12.35</jdbcHost>
<jdbcUsername>dbuser</jdbcUsername>
<jdbcPassword>pass</jdbcPassword>
</config>
どちらの場合も、次のような方法でアクセスできます。
String Host = config.getString("jdbcHost");
もう少しで完了です...同じアプローチを維持し、次のいずれかのような方法で実行されているアプリケーションのインスタンスの正しい構成ファイルを取得します。
すべての構成ファイルに異なる名前を付け、アプリケーションにいくつかの固有の基準(ユーザー名、ホスト名など)でそれらを取得させます。
アプリケーションが存在すると想定する環境変数に基づいて、コードベースの外部の場所にそれらを保持します。
同じプロジェクトでこれらのアプローチを組み合わせて使用したこともあります(ビルドプロセス構成では#1、ランタイム構成では#2)。
アプリケーションがデータベースで動作する場合、次のように「構成」テーブルを作成できます。
create table configuration (mode char(3), key varchar(255), value varchar(1023));
Initスクリプトを使用して初期化します。たとえば、次のような内容のinit.sqlを使用します。
insert into configuration values ('pro', 'param1', 'value1'); -- production
insert into configuration values ('dev', 'param1', 'value1'); -- development
insert into configuration values ('tst', 'param1', 'value1'); -- testing
...
このアプローチの利点は次のとおりです。
すべての環境で、構成データはプロパティファイルの形式でターゲットマシンに存在します。 SpringFrameworkの PropertyPlaceholderconfigurer を使用してこれらのプロパティをアプリにバインドし、環境間での移植性を維持します。
たとえば、アプリが実行されるすべてのマシンに/etc/myapp/database.propertiesが存在することがわかっている限り、Spring構成では、次のようなものが必要です。
<bean id="myPropertyConfigurer"
class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
<property name="locations">
<list>
<value>/etc/myapp/database.properties</value>
</list>
</property>
</bean>
<bean id="myDataSource" class="org.Apache.commons.dbcp.BasicDataSource">
<property name="driverClassName" value="com.mysql.jdbc.Driver" />
<property name="url"
value="jdbc:mysql://${db.Host}:3306/${db.name}" />
<property name="username" value="${db.user}" />
<property name="password" value="${db.pass}" />
</bean>
そのSpringクラスには、プロパティファイルを配置できる場所に関する多数のオプションがあります。それらを置換して、環境変数として渡すこともできます。
<bean id="myPropertyConfigurer"
class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
<property name="searchSystemEnvironment" value="true" />
<property name="systemPropertiesModeName" value="SYSTEM_PROPERTIES_MODE_OVERRIDE" />
<property name="locations">
<list>
<value>${database.configuration.file.url}</value>
</list>
</property>
</bean>
そしてbash_profile(または何でも):export Java_OPTS = "-Ddatabase.configuration.file.url = file:///etc/myapp/database.properties"
または、何をしているのかに応じて、「Java」を呼び出すときに渡されるのと同じ-Dオプション。
FWIW、私たちはRPMとしてプロパティファイルを個別に維持します。
さまざまな戦略がたくさんあります。それらのすべてが良好であり、あなたに最も合うものに依存します。
環境変数は、最も簡単な方法です。他の場合と同じように設定して、System.getenv("...")
を使用してアクセスします
Config は、構成ファイル管理ツールです。すべての環境に共通の構成を作成することも、環境固有の構成を作成することもできます。 XMLファイルとプロパティファイルを使い続け、環境設定の違いをConfigに維持させることができます。 Configは一元化されたデータベースと考えることができ、必要な形式で構成ファイルを出力できます。構成ファイルが必要なときはいつでも、それをConfigから目的の場所にデプロイ(プッシュまたはプル)するだけです。私はConfigチームの一員であることに注意してください。