2013-07-11 11 views
11

Sto scrivendo un'applicazione java che contiene molte impostazioni salvabili. Fondamentalmente la mia struttura di configurazione si presenta così:Il modo migliore per mantenere un file di configurazione per l'applicazione java

 
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.... 

Hai avuto l'idea. Ho provato a usare xml ma lavorare con dom4j è un problema, soprattutto ci sono molti nodi figlio con lo stesso nome in nodi genitore diversi e identici e ho bisogno di cambiarli molto. Finora il modo più hassle-meno scopro è utilizzare un file di testo come

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

[Game 2] 
... 

ma mi sento come questo è molto rudimentale. Quindi qual è la pratica migliore o standard nell'industria per il mantenimento dei file di configurazione in java?

EDIT: Vorrei che la soluzione fosse portatile, come copiare un file da un computer a un altro non interromperà il programma. (Scusa, dimentica di dirlo in anticipo.)

risposta

2

Avresti dovuto usare il marshaller automatico per scrivere il tuo file XML. Alcuni anni fa, ho utilizzato CastorXML ma oggi ci sono probabilmente API più moderne a tale scopo.

Con questa API, che, fondamentalmente:

  • memorizzare tutte le config in un semplice POJO
  • un'istanza di un Marshaller
  • chiamata marshaller.write (MyConfig)

Quando si desidera per caricare la configurazione:

  • Istanziare un unmarshaller
  • chiamata Marshaller.read (tuofile)

Si può descrivere la mappatura XML in un file di configurazione o utilizzare un default Marshaller (1 attributo di tag XML ~ 1)

è così semplice .

EDIT:

Dopo una ricerca in this thread, specifiche JAXB è venuto dopo la prima realease del CastorXML e l'implementazione Sun di JAXB sembra ormai essere uno standard per Java <-> XML mappatura.

+0

L'interruttore di offerta qui è che ho molti attributi con lo stesso nome, come il "nome giocatore". Quindi quando voglio cambiare 'Alice' con' Leo', voglio assicurarmi che non sovrascriva 'Bob' qui. CastorXML può garantirlo? Grazie. – YankeeWhiskey

1

Check out Apache Commons Configuration.

Fornisce un buon supporto per 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

Considerare l'utilizzo YAML per definire la configurazione, è molto meno dettagliata rispetto a XML, ad esempio:

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

è quindi possibile utilizzare la libreria Jackson con il YAML extension di interagire con la configurazione, per esempio per analizzare la configurazione:

File configFile = new File("..."); 
ObjectMapper mapper = new ObjectMapper(new YAMLFactory()); 
Configuration config = mapper.readValue(configFile, Configuration.class); 
Problemi correlati