Объединение файлов конфигурации

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

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

Я посмотрел на нескольких ресурсах:

Я так и не смог разобраться, что и как делать в стратегии конфигурации с commons-configuration2.

До сих пор я мог читать из одного файла конфигурации:

FileBasedConfigurationBuilder<PropertiesConfiguration> builder =
    new FileBasedConfigurationBuilder<PropertiesConfiguration>(PropertiesConfiguration.class)
        .configure(new Parameters().properties()
            .setFileName(ConfigurationResources.PROPERTIES_FILEPATH)
            .setThrowExceptionOnMissing(true)
            .setListDelimiterHandler(new DefaultListDelimiterHandler(';'))
            .setIncludesAllowed(false));

Любые идеи?


person Jordi    schedule 18.05.2017    source источник


Ответы (2)


Вам нужна CombinedConfiguration. Вот пример кода

Parameters params = new Parameters();
CombinedConfigurationBuilder builder = new CombinedConfigurationBuilder()
    .configure(params.fileBased().setFile(new File("configuration.xml")));
CombinedConfiguration cc = builder.getConfiguration();

Здесь файл configuration.xml будет содержать список файлов свойств.

<configuration systemProperties="systemProperties.xml">
  <!-- Load the system properties -->
  <system/>
  <!-- Now load the config file, using a system property as file name -->
  <properties fileName="myprops1.properties"/>

  <properties fileName="myprops2.propert"/>
</configuration>

Эта документация по комбинированной конфигурации будет очень полезна.

person 100rabh    schedule 11.08.2017

Parameters params = new Parameters();

FileBasedConfigurationBuilder<FileBasedConfiguration> config1 = new FileBasedConfigurationBuilder<FileBasedConfiguration>(
        PropertiesConfiguration.class)
                .configure(params.properties().setFileNamesetFileName("file1.properties")));
FileBasedConfigurationBuilder<FileBasedConfiguration> config2 = new FileBasedConfigurationBuilder<FileBasedConfiguration>(
        PropertiesConfiguration.class).configure(params.properties().setFileName("default_file2.properties"));


CombinedConfiguration config = new CombinedConfiguration(new OverrideCombiner());
config.addConfiguration(config1.getConfiguration());//this overrides config2
config.addConfiguration(config2.getConfiguration());
return config;

Это то, что я использовал в своем проекте для создания комбинированной конфигурации. Комбинированная конфигурация естественным образом создает иерархию конфигураций, взятых из разных или одного источника. Например, вы также можете написать что-то вроде: FileBasedConfigurationBuilder<FileBasedConfiguration> config2 = new FileBasedConfigurationBuilder<FileBasedConfiguration>( PropertiesConfiguration.class).configure(params.properties()‌​.setFileName(System.‌​getProperty("default‌​_file2.properties"))‌​);

FileBasedConfigurationBuilder можно заменить любой конфигурацией, которая вам может понравиться. Перейдите по ссылке https://commons.apache.org/proper/commons-configuration/apidocs/org/apache/commons/configuration2/builder/BasicConfigurationBuilder.html

person user6622569    schedule 15.09.2017
comment
Спасибо за ваши Коментарии. - person user6622569; 17.09.2017
comment
Обрабатывает ли это перезагрузку любого из исходных файлов свойств? - person hoshposh; 12.02.2018
comment
@hoshposh Когда вы используете ReloadingFileBasedConfigurationBuilder вместо FileBasedConfigurationBuilder и запускаете PeriodicReloadingTrigger, тогда да. - person cgrim; 23.10.2018