私の目標
JavaEE環境(私の特定の場合はGlassfish Webプロファイル)があり、次の機能を使用してアプリケーションを構成するコンテナーに依存しない方法が必要です。
- 他に何も指定されていない場合のデフォルト構成(WARファイル内)
- 2つのレイヤーでのカスタム構成(WARファイルの外部):
- ホスト固有の設定(外部プロパティファイル、たとえばいくつかの作業ディレクトリ)
- アプリケーション固有の設定(データベース内。メールボックスのサイズなど)
私の願いは、アプリケーションをデプロイして実行するための前提条件をできるだけ少なくすることです(JNDIデータソースをセットアップし、WARファイルをデプロイし、いくつかの構成フォルダーにオプションの.propertiesファイルを用意します)。終わり)。
これは私の最初の質問につながります:これは一般的/良い/便利な設定ですか、それとも不必要に複雑および/または非常にエキゾチックですか?
私のアイデア(これまでのところ)
デフォルト設定
デフォルトの構成は、プロパティファイルにあります。
src/main/resources/config/default.properties
アプリケーションスコープのBeanは、次に説明するように、初期化時にこのプロパティを読み取ります。
@Named
@ApplicationScoped
public class Configuration implements Serializable {
...
@PostConstruct
public void initConfiguration() {
loadDefaultConfiguration();
}
private void loadDefaultConfiguration() {
ClassLoader classLoader = Thread.currentThread().getContextClassLoader();
try (InputStream input = classLoader.getResourceAsStream("/config/default.properties")) {
properties.load(input);
} catch(IOException ex) {
LOGGER.error(...);
}
}
}
アプリケーション固有の設定
これらの設定は、キー列と値列を持つデータベーステーブルに保存されます。これらは常にEntityManagerを介してアクセスされ、JPA実装のキャッシングが巧妙になることを期待しています:)。ここでの利点は、アプリケーションの実行中にこれらの設定を簡単に変更できることです。
@Named
@ApplicationScoped
public class Configuration implements Serializable {
...
public T getProperty(final PropertyKeyEnum key, final Class<T> type) {
if (key.getSource() == PropertySourceEnum.DATABASE) {
return configurationDao.getByKey(key.getKey(), type);
}
...
}
}
ホスト固有の設定
最後に、これが私の主な問題です:
コンテナに依存しない方法で外部プロパティファイルにアクセスするにはどうすればよいですか?ユーザーは、myAppName.properties
ファイルをコンテナーのデフォルトの構成フォルダーに配置するだけで、アプリケーションはこのファイルを見つけてロードできる必要があります(少なくともアプリケーションの起動時に)。
私の環境
- JavaSE 7
- JavaEE 6
- Glassfish 3.1.2 Web(ただし、これは重要ではありません;))
アップデート
Glassfishの管理領域で、簡単にアクセスできるいくつかのシステムプロパティを指定できる場所を見つけました。
System.getProperty("myApp.propertyName");
これは、外部の.propertiesファイルへのパスを保存するために使用できますが、これがクリーンな方法であるかどうかはわかりません。
- すべてのコンテナ(JavaEEをサポート)にこのような優れた機能があるかどうかはわかりません
- Webアプリケーションからプレーンファイルにアクセスしたくない