16

J2SEアプリケーションのユーザー固有およびマシン固有の ランタイム構成データをどこに保存しますか?

(たとえば、Windowsの場合はC:\ Users \ USERNAME \ AppData \ Roaming </ em>、 Unixの場合は/ home / username)

プラットフォームに依存しない方法で、ファイルシステム内のこれらの場所をどのように取得しますか?

4

6 に答える 6

26

最初にフォーマットについて:

  1. Javaプロパティ ファイルは、キーと値のペアに適しています (改行文字も自動的に処理します)。「ドット表記」を使用することで、ある程度の構造化が可能です。欠点は、この構造ではトップレベルの構成エンティティを簡単に列挙したり、ドリルダウン方式で作業したりできないことです。多くの場合微調整可能な環境固有の設定の小さなセットに最適
  2. XML ファイル - さまざまな Java フレームワーク (特に J2EE と Spring) のより複雑な構成によく使用されます。少なくともSpringについて学ぶことをお勧めします。Spring を使用しないと決めたとしても、知っておく価値のあるアイデアがたくさん含まれています。独自の XML 構成を展開する場合は、カスタマイズされたシリアル化オプションを使用してXStreamを使用することをお勧めします。XML を解析する必要がある場合は、XOMを参照してください。ところで、Spring ではカスタム XML 構成言語をプラグインすることもできますが、これは比較的複雑な作業です。XML 構成は、エンド ユーザーが見たり微調整したりしない、より複雑な「内部」構成に最適です。
  3. 直列化された Java オブジェクト - オブジェクトの状態を永続化し、後で復元するための迅速かつ簡単な方法。構成 GUI を作成し、構成が人間が判読できるかどうかを気にしない場合に役立ちます。クラスを進化させるときは、互換性の問題に注意してください。
  4. プリファレンス - Java 1.4で導入され、入力されたテキスト、数値、バイト配列、およびその他のプリミティブをプラットフォーム固有のストレージに格納できます。Windows では、これがレジストリです ( HKLMまたはHKCUの下の/Software/JavaSoft/Prefsから選択できます)。Unix では、同じ API がユーザーの home または/etcの下にファイルを作成します。各設定ハイブは、XML ファイルとしてエクスポートおよびインポートできます。「java.util.prefs.PreferencesFactory」JVM プロパティを実装クラス名に設定することにより、 PreferencesFactoryインターフェースのカスタム実装を指定できます。

一般に、prefs API を使用することは、アプリのシナリオに基づいて、良いことにも悪いことにもなり得ます。

  1. 同じコードの複数のバージョンを同じマシン上で異なる構成で実行する予定がある場合、Preferences API の使用はお勧めできません。
  2. 制限された環境 (Windows ドメインまたは厳重に管理された Unix ボックス) でアプリケーションを使用する場合は、必要なレジストリ キー/ディレクトリに適切にアクセスできることを確認する必要があります。これは私を何度も驚かせました。
  3. ローミング プロファイル (レプリケートされたホーム ディレクトリ) に注意してください。これらは、複数のアクティブなマシンが関係している場合の面白いシナリオを補います。
  4. 設定は、アプリケーションのディレクトリの下にある構成ファイルほど明白ではありません。デスクトップ サポート スタッフのほとんどは、それらを期待しておらず、好んでいません。

環境設定のファイル レイアウトに関しては、アプリケーションによって異なります。一般的な提案は次のとおりです。

  1. ルートまたは /META-INF ディレクトリの下にあるアプリケーションの JAR 内に、ほとんどの XML ファイルをパッケージ化します。これらのファイルは読み取り専用で、アプリケーションのプライベートと見なされます。
  2. ユーザーが変更可能な構成を$APP_HOME/confの下に置きます。これは、主にプロパティー・ファイルで構成され、場合によっては単純な XML ファイル (XStream シリアライゼーション) で構成されます。これらのファイルは、インストール プロセスの一部として微調整され、通常はユーザーが保守することはできません。
  3. ユーザーホームの下のドットディレクトリ (つまり、'~/.myapplication') にユーザー設定を保存します。ユーザー構成は、アプリケーションのconfディレクトリ内の構成を上書きする場合があります。アプリケーション内から行われた変更はすべてここに移動します (次のポイントも参照してください)。
  4. $APP_HOME/varディレクトリを使用して、(ユーザーではなく) このアプリケーション インスタンスに固有のその他の可変データを保存することもできます。このアプローチのもう 1 つの利点は、1 つのディレクトリをコピーするだけで、アプリケーション全体とその構成を移動およびバックアップできることです。

これは、構成を管理するためのいくつかの標準的な手法を示しています。生の JRE から始めて、Spring/Guice を追加するか、完全な J2EE コンテナー (おそらく組み込みの Spring を使用) を使用して、さまざまなライブラリーとツールを使用してそれらを実装できます。

構成を管理するためのその他のアプローチは次のとおりです。

  1. 異なる構成を使用してアプリケーションの複数のインスタンスを実行するために、複数のベース ディレクトリを使用します。
  2. 集中構成管理のための軽量 レジストリーの使用
  3. 各マシンのホスト固有の値を含む集中管理された構成管理データベース (CMDB) ファイルは、すべての本番ホストに対して毎晩 rsync されます。アプリケーションはテンプレート化された構成を使用し、実行時に現在のホスト名に基づいて CMDB から選択します。
于 2008-10-11T19:33:52.123 に答える
14

これは、J2SEアプリケーションの種類によって異なります。

  • J2SE実行可能JARファイル(非常に単純):user.homeSystemプロパティを使用してhome-dirを検索します。次に、それに応じてサブディレクトリを作成します(たとえば、PGP、SVN、...など)
  • Java Web Startは、安全なプロパティに非常に優れたインクルードメソッドを提供します。常にユーザー固有
  • 最後に、Eclipse RCP:ユーザー用のワークスペース(user.homeから派生)の概念と、コンピューター全体で使用するための構成(Vistaでトリッキーにアクセスする方法が完全にはわからない)があります。

これらのアプローチはすべて、注意して使用すると、正しいseparatorCharを使用します。OSはニュートラルです。

于 2008-10-11T17:44:09.520 に答える
6

Javaには、これを行うための特別なライブラリがjava.util.prefs.Preferencesにあります。

Preferences userPrefs = Preferences.getUserNodeForPackage(MyClass.class); // Gets user preferences node for MyClass
Preferences systemPrefs = Preferences.getSysteNodeForPackage(MyClass.class); // Gets system preferences node for MyClass
Preferences userPrefsRoot = Preferences.getUserRoot(); // Gets user preferences root node
Preferences systemPrefsRoot = Preferences.getSystemRoot(); // Gets system preferences root node
于 2008-10-11T17:46:45.523 に答える
1

リソースバンドルを確認することをお勧めします。

于 2008-10-11T17:36:40.440 に答える
0

ユーザー固有の構成の場合、「user.home」システムプロパティが指すフォルダーに構成ファイルを書き込むことができます。もちろん、そのマシンでのみ動作します。

于 2008-10-11T17:43:29.273 に答える
0

私はこれを使います

    文字列 pathFile = null;
    if(OS.contains("win")){
        pathFile = System.getenv("AppData");
    }そうしないと{
        pathFile = System.getProperty("user.home");
    }

アプリケーションの設定をここに保存します C:\Users\USERNAME\AppData\ Windows では user.home (/home/USERNAME) 他のプラットフォームでは

于 2015-07-25T08:56:16.533 に答える