2013-07-11 6 views
11

Ich schreibe eine Java-Anwendung zu erhalten, die eine Menge speicherbare Einstellungen enthält. Grundsätzlich sieht meine Konfigstruktur wie folgt aus:beste Weg, um eine Konfigurationsdatei für die Java-Anwendung

 
Config 
|_ game 1 
    |_ Game name: blah... 
    |_ Player name: alice 
    |_ Player name: bob 
    |_ other settings... 
|_ game 2 
    |_ Game name: hah 
    |_ Player name: alice 
    |_ Player name: bob 
    |_ other settings... 
|_ game n.... 

Sie haben die Idee. Ich habe versucht, xml zu verwenden, aber die Arbeit mit dom4j ist ein Schmerz, vor allem gibt es viele Kindknoten mit dem gleichen Namen in verschiedenen und gleichen Elternknoten und ich muss sie sehr ändern. Bisher ist die stresslose Weise, die ich entdecken, ist eine einfache Textdatei verwenden, wie

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

[Game 2] 
... 

Aber ich fühle mich wie das sehr rudimentär ist. Was ist die beste oder gängige Praxis in der Industrie, um Konfigurationsdateien in Java zu verwalten?

EDIT: Ich möchte die Lösung portabel sein, wie eine Datei von einem Computer auf einen anderen kopieren wird nicht das Programm zu brechen. (Leider vergessen dies voraus erwähnen.)

Antwort

2

Sie automatische Einweiser verwendet haben, sollten Sie Ihre XML-Datei zu schreiben. Vor ein paar Jahren habe ich CastorXML verwendet, aber heute gibt es wahrscheinlich modernere APIs für diesen Zweck.

Mit dieser API, Sie im Grunde:

  • Speichern Sie alle Ihre config in einem einfachen POJO
  • Instantiate einen Marshaller
  • Anruf marshaller.write (MyConfig)

Wenn Sie möchten, Um Ihre Konfiguration zu laden:

  • Instanziieren eine Unmarshaller
  • Anruf Marshaller.read (yourfile)

Sie das XML-Mapping in einer Konfigurationsdatei beschreiben oder ein Standard-Marshaller (1 Attribut ~ 1 XML-Tag)

es so einfach ist, verwenden .

EDIT:

Nach einer Suche in this thread kam JAXB Spezifikation nach dem ersten realease von CastorXML und der Sonne Umsetzung von JAXB scheint jetzt ein Standard für Java <-> XML Mapping zu sein.

+0

Der Deal Breaker hier ist, dass ich viele Attribute mit dem gleichen Namen haben, wie der 'Spielername'. Wenn ich also "Alice" in "Leo" ändern möchte, möchte ich sicherstellen, dass "Bob" hier nicht überschrieben wird. Kann CastorXML das garantieren? Vielen Dank. – YankeeWhiskey

1

prüfen Apache Commons Configuration aus.

Es bietet eine gute Unterstützung für hierarchical configurations.

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

Betrachten YAML mit Ihrer Konfiguration zu definieren, ist es viel weniger ausführlich im Vergleich zu XML, zum Beispiel:

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

Sie dann die Jackson Bibliothek mit den YAML extension kann mit der Konfiguration zu kommunizieren, sich für Beispiel zum Analysieren der Konfiguration:

Verwandte Themen