Какие могут быть легкие библиотеки конфигурации Java для обработки сложной конфигурации?

Мне нужно обработать относительно сложный набор параметров конфигурации для Java-приложения. Требования примерно:

  • Вложенные значения конфигурации со списками, картами и т.д. - не просто пары с ключом/значением
  • Несколько конфигурационных файлов, в которых более поздние файлы конфигурации могут интеллектуально переопределять настройки из более ранних файлов конфигурации.
  • Несколько ссылок на один и тот же настроенный элемент из разных мест
  • Наследуемые сконфигурированные объекты, поэтому новый объект может скопировать конфигурацию из предыдущего объекта, может просто изменить определенные вещи.
  • Очень маленький код, необходимый для новых параметров конфигурации - оптимальным было бы просто добавить @Configurable аннотацию к полю или что-то подобное

Теперь я знаю, что Spring выполняет все это определенным образом. Однако у него есть некоторые недостатки, хотя ни один из них не смертелен:

  • Spring на самом деле не оптимизирован как язык конфигурации, так как он несколько больше обеспокоен потребностью в зависимостях
  • Файлы конфигурации XML больше предназначены для отправки в JAR файл и не изменяются конечным пользователем со всеми настраиваемыми свойствами, на которые ссылается отдельный файл свойств или аналогичный - где мне нужен файл конфигурации, который будет полным, и легко модифицируется конечным пользователем. Конфигурация
  • Spring несколько утомительна при обновлении онлайн-конфигурации без прекращения текущих подключений и когда должны быть отдельные примитивы проверки конфигурации, которые должны полностью проверять конфигурацию, но фактически ничего не делают

Итак, я спрашиваю, можете ли вы подумать о каких-либо альтернативах, которые отвечали бы моим требованиям?

Я вроде как YamlBeans, но ему не хватает нескольких функций.

Ответы

Ответ 2

Этот выглядит интересным, хотя я должен признать, что я его не использовал:

http://owner.aeonbits.org

Ответ 3

Мы используем Constretto в нашем проекте. Очень легкий и простой в использовании.

Ответ 4

Вы можете попробовать cfg4j. Он в основном ориентирован на распределенные приложения, но поддерживает большинство запрошенных функций.

Ответ 5

Для большинства требований я смог выполнить это со стандартными свойствами. Я завернул объект Properties в классе конфигурации, который читал файл свойств из:

  • общий кувшин
  • "приложение" jar/classpath
  • файловая система (указанная как свойство -D для JVM)

Код класса конфигурации таков, что свойства в приложении переписывают общие свойства и свойства файловой системы перезаписывают свойства уровня приложения.

Конфигурация загружается как Spring bean и предоставляет свой внутренний объект Properties объекту PropertyPlaceholderConfigurer, который допускает замену $var в Spring xml файлах. Поскольку config является Spring bean, его можно впрыснуть туда, где он мне нужен.

Что-то вроде этого должно быть расширяемым для обработки файлов JSON или YAML вместо файлов свойств, чтобы разрешать карты, список и т.д.