Лучший способ сохранить файл конфигурации для приложения Java

Я пишу 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?

EDIT. Я бы хотел, чтобы решение было переносимым, например, копирование файла с одного компьютера на другой не нарушит работу программы. (Извините, не забывайте об этом.)

Ответ 1

Лучший способ сохранить настройки/предпочтения в java - использовать API настроек.

Ответ 2

Вы должны были использовать автоматический маршаллер для записи вашего XML файла. Несколько лет назад я использовал CastorXML, но сегодня для этого есть, вероятно, более современные API.

С помощью этого API вы в основном:

  • Храните всю свою конфигурацию в простой POJO
  • Мгновенное действие маршаллера
  • Вызов marshaller.write(MyConfig)

Если вы хотите загрузить конфигурацию:

  • Создайте экземпляр Unmarshaller
  • вызов Marshaller.read(yourFile)

Вы можете описать сопоставление XML в файле конфигурации или использовать по умолчанию Marshaller (1 атрибут ~ 1 XML-тег)

Это так просто.

EDIT:

После поиска в этой теме спецификация JAXB появилась после первой версии CastorXML, а реализация Sun JAXB теперь является стандартом для отображения Java <-> XML.

Ответ 3

Проверьте Конфигурация сообщества Apache.

Он обеспечивает хорошую поддержку иерархических конфигураций .

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

Ответ 4

Рассмотрите возможность использования YAML для определения вашей конфигурации, это гораздо менее подробный по сравнению с XML, например:

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

Затем вы можете использовать библиотеку Jackson с расширением YAML для взаимодействия с конфигурацией, например, для анализа конфигурации:

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