2013-07-11 13 views
11

多くのsavable設定を含むJavaアプリケーションを作成しています。基本的には私の設定構造は次のようになります:Javaアプリケーション用の設定ファイルを維持するための最良の方法

あなたは考えがあります。私はxmlを使用しようとしましたが、dom4jを扱う​​のは苦痛です。特に、異なる親ノードに同じ名前の子ノードがたくさんあり、それらをたくさん変更する必要があります。これまでのところ、私が発見し、最も手間のない方法は

 
[Game 1] 
Game name: blah 
Player name: alice 
Player name: bob 
... 

[Game 2] 
... 

のようなプレーンテキストファイルを使用している。しかし、これは非常に初歩的であるような気がします。では、Javaで設定ファイルを維持するための業界でのベストプラクティスまたは標準的なプラクティスは何ですか?

EDIT:私は、あるコンピュータから別のコンピュータにファイルをコピーしても、プログラムを破壊しないように、このソリューションを移植可能にしたいと思います。 (申し訳ありませんが、先に言及して忘れてください)

答えて

2

XMLファイルを書き込むには、自動マーシャラーを使用してください。数年前、私はCastorXMLを使用しましたが、今日、もっと現代的なAPIがあるでしょう。

このAPIを使用すると、基本的には:

  • ストアしたい場合は、単純なPOJO
  • ですべての設定がマーシャラー
  • コールmarshaller.write(のMyConfig)

をインスタンス化設定をロードする:

  • あなたが設定ファイルにXMLマッピングを記述したり

    それは簡単なことであるデフォルトマーシャラー(1つの属性〜1つのXMLタグ)を使用することができます

たUnmarshaller

  • コールMarshaller.read(yourFile)をインスタンス化。

    EDIT:this threadで検索した後

    、JAXB仕様はCastorXMLの最初のrealease後に来たとJAXBのSunの実装では、Java <-> XMLマッピングするための標準的なことを今ようです。

  • +0

    ここでは、「player name」のように同じ名前の多くの属性があります。ですから、 'Alice'を' Leo'に変更したいとき、 'Bob 'を上書きしないようにしたいと思っています。 CastorXMLはこれを保証できますか?ありがとう。 – YankeeWhiskey

    5

    Javaで設定や環境設定を保存する最も良い方法は、Preferences APIを使用することです。

    1

    Apache Commons Configurationをご覧ください。

    hierarchical configurationsの良好なサポートを提供します。以下のために、

    games: 
        - name: 'game 1' 
        players: ['Bob', 'Alice'] 
        ... 
        - name: 'game 2' 
        players: ['Bob', 'Alice'] 
        ... 
    

    あなたは、構成と対話するYAML extensionJacksonライブラリを使用することができます。

    XMLConfiguration config = new XMLConfiguration("games.xml"); 
    String gameName = config.getString("game1.name"); 
    List<Object> playerNames = config.getList("game1.players.player.name"); 
    // ... 
    config.setProperty("game1.name", "Space Invaders"); // update game name 
    config.addProperty("game1.players.player(-1).name", "ted"); // add new players 
    config.addProperty("game1.players.player(-1).name", "carol"); 
    config.clearTree("game1.players.player(1)"); // remove a player 
    
    // Or with XPath 
    config.setExpressionEngine(new XPathExpressionEngine()); 
    config.addProperty("game1/players player/name", "ted"); 
    config.addProperty("game1/players player/name", "carol"); 
    config.clearTree("game1/players/player[2]"); 
    
    1

    あなたの構成を定義するためにYAMLを使用することを検討して、それは例えば、XMLに比べてはるかに少ない冗長です例:設定を解析する例:

    File configFile = new File("..."); 
    ObjectMapper mapper = new ObjectMapper(new YAMLFactory()); 
    Configuration config = mapper.readValue(configFile, Configuration.class); 
    
    関連する問題