维护java应用程序配置文件的最佳方法

时间:2013-07-11 12:04:34

标签: java config

我正在编写一个包含许多可用设置的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....

你明白了。我尝试使用xml但是使用dom4j是一种痛苦,特别是在不同和相同的父节点中有很多具有相同名称的子节点,我需要对它们进行大量更改。到目前为止,我发现的最简单的方法是使用像

这样的纯文本文件
[Game 1]
Game name: blah
Player name: alice
Player name: bob
...

[Game 2]
...

但我觉得这是非常简陋的。那么,在java中维护配置文件的行业最佳或标准做法是什么?

编辑:我希望解决方案具有可移植性,例如将文件从一台计算机复制到另一台计算机不会破坏程序。 (抱歉忘了提前说。)

4 个答案:

答案 0 :(得分:5)

在java中存储设置/首选项的最佳方法是使用Preferences API

答案 1 :(得分:2)

您应该使用自动编组程序来编写XML文件。几年前,我使用CastorXML,但今天,可能有更多现代API用于此目的。

使用此API,您基本上是:

  • 将所有配置存储在简单的POJO中
  • 实例化Marshaller
  • 致电marshaller.write(MyConfig)

如果要加载配置:

  • 实例化Unmarshaller
  • 致电Marshaller.read(yourFile)

您可以在配置文件中描述XML映射或使用默认的Marshaller(1个属性~1个XML标记)

就这么简单。

编辑:

this thread中搜索之后,JAXB规范在CastorXML的第一次发布之后出现,而JAXB的Sun实现现在似乎是Java <-> XML映射的标准。

答案 2 :(得分:1)

查看Apache Commons Configuration

它为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]");

答案 3 :(得分:1)

考虑使用YAML来定义您的配置,与XML相比,它更加冗长,例如:

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

然后,您可以使用Jackson YAML extension库与配置进行交互,例如解析配置:

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