6

私の目標

JavaEE環境(私の特定の場合はGlassfish Webプロファイル)があり、次の機能を使用してアプリケーションを構成するコンテナーに依存しない方法が必要です。

  1. 他に何も指定されていない場合のデフォルト構成(WARファイル内)
  2. 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ファイルへのパスを保存するために使用できますが、これがクリーンな方法であるかどうかはわかりません

  1. すべてのコンテナ(JavaEEをサポート)にこのような優れた機能があるかどうかはわかりません
  2. Webアプリケーションからプレーンファイルにアクセスしたくない
4

2 に答える 2

1

同僚と話し、いくつかの調査を行った後、ホスト固有の (外部) 構成用に以下を実装しました。

とにかくアプリケーション用の作業ディレクトリが必要なので、この作業ディレクトリを外部構成の場所としても使用することにしました。したがって、環境変数 (例: MYAPP_HOME) を使用するか、変数が設定されていない場合はユーザーのホーム フォルダー (例: <user.home>/.myapp)を使用します。

private Path discoverRootDirectory() {
    String myAppHome = System.getenv("MYAPP_HOME");

    if (myAppHome == null) {
        return Paths.get(System.getProperty("user.home"), ".myapp");
    } else {
        return Paths.get(myAppHome);
    }
}

次に、プロパティ ファイルが通常どおり読み込まれます。

private void loadConfiguration() {
    properties = new Properties();
    // ...
    try (InputStream inputStream = Files.newInputStream(discoverRootDirectory())) {
        properties.load(inputStream);
    } catch (FileAccessException | IOException ex) {
        // ...
    }
}
于 2013-02-16T13:37:50.767 に答える
-1

アプリの移植性を維持する方法を作成しようとしている場合は、手動で (コンピューターではなく人間によって) より迅速かつ効率的に処理されるものを処理するプログラムを作成しようとしていると思います。各コンテナー (Glassfish、JBoss、WebSphere など) は、別のコンテナーと同じ方法で実行する必要はありません。したがって、移植性を求めている場合、構成ファイルは大きく異なる可能性があり、通常は大きく異なります。さまざまなサーバーでアプリを実行し、構成ファイルを保存する方法を理解することをお勧めします。せいぜい、1 か所で行ったことを実行して、スクリプトが各プレースホルダー (ポート番号など) の値を置き換える単純なプロパティ ファイルで使用できるプレースホルダーを含むファイルを作成することができます。異なる種類のサーバーをどのくらいの頻度で切り替えますか? よく言うと、これよりも多くの問題が発生します。プラットフォームを選択して、それに固執することをお勧めします。そうすれば、問題がはるかに少なくなります。

ここで気に入った回答が得られない場合は、Server Fault (このサイトの姉妹サイト) を試してください。

于 2012-10-22T01:18:58.150 に答える