Spring Boot и несколько внешних файлов конфигурации

У меня есть несколько файлов свойств, которые я хочу загрузить из classpath. В разделе /src/main/resources есть один набор по умолчанию, который является частью myapp.jar . Мой springcontext ожидает, что файлы будут находиться в пути к classам. т.е.

   к   

Мне также нужна опция переопределения этих свойств с помощью внешнего набора. У меня есть внешняя папка config в cwd . В соответствии с папкой конфигурации папки загрузки boot boot должен находиться в classpath. Но это не ясно из документа, если он будет только переопределять applicaiton.properties оттуда или все свойства в config.

Когда я тестировал его, набирается только application.properties , и остальные свойства все еще берутся из /src/main/resources . Я попытался предоставить их как список, разделенный запятой, на spring.config.location но набор по умолчанию все еще не spring.config.location .

Как сделать mulitiple внешние файлы конфигурации переопределить стандартные?

В качестве обходного пути я в настоящее время использовал app.config.location (свойство приложения), которое я предоставляю через командную строку. т.е.

 java -jar myapp.jar app.config.location=file:./config 

и я изменил свой applicationcontext на

  

И так я делаю разделение между файлом и classpath при загрузке приложения.
редактирует:

 //psuedo code if (StringUtils.isBlank(app.config.location)) { System.setProperty(APP_CONFIG_LOCATION, "classpath:"); } 

Мне бы очень хотелось не использовать вышеописанное решение и перенаправить все внешние файлы конфигурации в путь к classам, как это делается для файла application.properties .

При использовании Spring Boot свойства загружаются в следующем порядке (см. Внешнюю конфигурацию в справочном руководстве Spring Boot).

  1. Аргументы командной строки.
  2. Свойства Java-системы (System.getProperties ()).
  3. Переменные среды ОС.
  4. JNDI-атрибуты из java: comp / env
  5. RandomValuePropertySource, который имеет свойства только случайным образом. *.
  6. Свойства приложения за пределами вашей упакованной банки (application.properties, включая YAML и варианты профиля).
  7. Свойства приложения, упакованные внутри вашей банки (application.properties, включая YAML и варианты профиля).
  8. @PropertySource для ваших @Configuration classов.
  9. Свойства по умолчанию (заданные с помощью SpringApplication.setDefaultProperties).

При разрешении свойств (т. @Value("${myprop}") выполняется в обратном порядке (начиная с 9).

Чтобы добавить разные файлы, вы можете использовать свойства spring.config.location которых содержится список файлов свойств или файлов (каталогов), разделенных запятыми.

 -Dspring.config.location=your/config/dir/ 

В приведенном выше примере будет добавлен каталог, в котором будут application.properties файлы application.properties .

 -Dspring.config.location=classpath:job1.properties,classpath:job2.properties 

Это добавит 2 файла свойств в загружаемые файлы.

Файлы конфигурации и местоположения по умолчанию загружаются до того, как spring.config.location дополнительные значения spring.config.location , что означает, что последний всегда будет переопределять свойства, установленные в предыдущих. (См. Также этот раздел справочника Spring Boot).

Если spring.config.location содержит каталоги (в отличие от файлов), они должны заканчиваться на / (и будут добавлены имена, сгенерированные из spring.config.name перед загрузкой). Путь по умолчанию classpath:,classpath:/config,file:,file:config/ всегда используется, независимо от значения spring.config.location . Таким образом, вы можете настроить значения по умолчанию для своего приложения в application.properties (или любом другом spring.config.name имени, которое вы выбираете с помощью spring.config.name ) и переопределить его во время выполнения с другим файлом, сохраняя значения по умолчанию.

С Spring boot, spring.config.location действительно работает, просто предоставляйте файлы свойств, разделенные запятыми.

см. ниже код

 @PropertySource(ignoreResourceNotFound=true,value="classpath:jdbc-${spring.profiles.active}.properties") public class DBConfig{ @Value("${jdbc.host}") private String jdbcHostName; } } к @PropertySource(ignoreResourceNotFound=true,value="classpath:jdbc-${spring.profiles.active}.properties") public class DBConfig{ @Value("${jdbc.host}") private String jdbcHostName; } } 

можно установить стандартную версию jdbc.properties внутри приложения. Это могут быть внешние версии.

 java -jar target/myapp.jar --spring.config.location=classpath:file:///C:/Apps/springtest/jdbc.properties,classpath:file:///C:/Apps/springtest/jdbc-dev.properties 

На основе значения профиля, заданного с использованием свойства spring.profiles.active, будет получено значение jdbc.host. Поэтому, когда (на windowsх)

 set spring.profiles.active=dev 

jdbc.host будет принимать значения из jdbc-dev.properties.

для

 set spring.profiles.active=default 

jdbc.host будет принимать значения из jdbc.properties.

Взгляните на PropertyPlaceholderConfigurer, я нахожу его более понятным, чем аннотация.

например

 @Configuration public class PropertiesConfiguration { @Bean public PropertyPlaceholderConfigurer properties() { final PropertyPlaceholderConfigurer ppc = new PropertyPlaceholderConfigurer(); // ppc.setIgnoreUnresolvablePlaceholders(true); ppc.setIgnoreResourceNotFound(true); final List resourceLst = new ArrayList(); resourceLst.add(new ClassPathResource("myapp_base.properties")); resourceLst.add(new FileSystemResource("/etc/myapp/overriding.propertie")); resourceLst.add(new ClassPathResource("myapp_test.properties")); resourceLst.add(new ClassPathResource("myapp_developer_overrides.properties")); // for Developer debugging. ppc.setLocations(resourceLst.toArray(new Resource[]{})); return ppc; } 

У меня просто была схожая проблема с этим и, наконец, выяснили причину: файл application.properties имел неправильные атрибуты собственности и rwx. Поэтому, когда tomcat запущен, файл application.properties находился в правильном месте, но принадлежал другому пользователю:

 $ chmod 766 application.properties $ chown tomcat application.properties 

У меня такая же проблема. Я хотел иметь возможность перезаписать внутренний файл конфигурации при запуске с внешним файлом, аналогичным обнаружению Spring Boot application.properties. В моем случае это файл user.properties, где хранятся мои приложения.

Мои требования:

Загрузите файл из следующих мест (в этом порядке)

  1. Путь к classам
  2. A / config поддиректора текущего каталога.
  3. Текущий каталог
  4. Из каталога или местоположения файла, заданного параметром командной строки при запуске

Я придумал следующее решение:

 import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Value; import org.springframework.context.annotation.Bean; import org.springframework.core.io.ClassPathResource; import org.springframework.core.io.PathResource; import org.springframework.core.io.Resource; import java.io.IOException; import java.util.Properties; import static java.util.Arrays.stream; @Configuration public class PropertiesConfig { private static final Logger LOG = LoggerFactory.getLogger(PropertiesConfig.class); private final static String PROPERTIES_FILENAME = "user.properties"; @Value("${properties.location:}") private String propertiesLocation; @Bean Properties userProperties() throws IOException { final Resource[] possiblePropertiesResources = { new ClassPathResource(PROPERTIES_FILENAME), new PathResource("config/" + PROPERTIES_FILENAME), new PathResource(PROPERTIES_FILENAME), new PathResource(getCustomPath()) }; // Find the last existing properties location to emulate spring boot application.properties discovery final Resource propertiesResource = stream(possiblePropertiesResources) .filter(Resource::exists) .reduce((previous, current) -> current) .get(); final Properties userProperties = new Properties(); userProperties.load(propertiesResource.getInputStream()); LOG.info("Using {} as user resource", propertiesResource); return userProperties; } private String getCustomPath() { return propertiesLocation.endsWith(".properties") ? propertiesLocation : propertiesLocation + PROPERTIES_FILENAME; } } 

Теперь приложение использует ресурс classpath, но также проверяет наличие ресурсов в других местах. Будет выбран и использован последний ресурс. Я могу запустить свое приложение с java -jar myapp.jar –properties.location = / directory / myproperties.properties, чтобы использовать местоположение свойств, которое плавает на моей лодке.

Важная деталь здесь: используйте пустую строку в качестве значения по умолчанию для свойства.location в annotations @Value, чтобы избежать ошибок, когда свойство не установлено.

Соглашение для свойства.location: Используйте каталог или путь к файлу свойств как property.location.

Если вы хотите переопределить только определенные свойства, свойство PropertiesFactoryBean с setIgnoreResourceNotFound (true) может использоваться с массивом ресурсов, установленным как местоположения.

Я уверен, что это решение может быть расширено для обработки нескольких файлов …

РЕДАКТИРОВАТЬ

Здесь мое решение для нескольких файлов 🙂 Как и раньше, это можно комбинировать с PropertiesFactoryBean.

 import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Value; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.core.io.ClassPathResource; import org.springframework.core.io.PathResource; import org.springframework.core.io.Resource; import java.io.IOException; import java.util.Map; import java.util.Properties; import static java.util.Arrays.stream; import static java.util.stream.Collectors.toMap; @Configuration class PropertiesConfig { private final static Logger LOG = LoggerFactory.getLogger(PropertiesConfig.class); private final static String[] PROPERTIES_FILENAMES = {"job1.properties", "job2.properties", "job3.properties"}; @Value("${properties.location:}") private String propertiesLocation; @Bean Map myProperties() { return stream(PROPERTIES_FILENAMES) .collect(toMap(filename -> filename, this::loadProperties)); } private Properties loadProperties(final String filename) { final Resource[] possiblePropertiesResources = { new ClassPathResource(filename), new PathResource("config/" + filename), new PathResource(filename), new PathResource(getCustomPath(filename)) }; final Resource resource = stream(possiblePropertiesResources) .filter(Resource::exists) .reduce((previous, current) -> current) .get(); final Properties properties = new Properties(); try { properties.load(resource.getInputStream()); } catch(final IOException exception) { throw new RuntimeException(exception); } LOG.info("Using {} as user resource", resource); return properties; } private String getCustomPath(final String filename) { return propertiesLocation.endsWith(".properties") ? propertiesLocation : propertiesLocation + filename; } } 

это простой подход с использованием весеннего ботинка

TestClass.java

 @Configuration @Profile("one") @PropertySource("file:/{selected location}/app.properties") public class TestClass { @Autowired Environment env; @Bean public boolean test() { System.out.println(env.getProperty("test.one")); return true; } } 

контекст app.properties в выбранном вами месте

 test.one = 1234 

ваше приложение загрузки весны

 @SpringBootApplication public class TestApplication { public static void main(String[] args) { SpringApplication.run(testApplication.class, args); } } 

и предопределенный контекст application.properties

 spring.profiles.active = one 

вы можете записать столько classов конфигурации, сколько хотите, и включить / отключить их, установив spring.profiles.active = имя / имена профиля {разделенные запятыми}

поскольку вы можете видеть, что весенняя загрузка – это здорово, что ей нужно когда-нибудь знакомиться, стоит упомянуть, что вы можете использовать @Value в своих полях, а также

 @Value("${test.one}") String str; 

Spring boot позволяет нам писать разные профили для записи в разных средах, например, мы можем иметь отдельные файлы свойств для производства, qa и локальные среды

Файл application-local.properties с конфигурациями в соответствии с моей локальной машиной

 spring.profiles.active=local spring.data.mongodb.host=localhost spring.data.mongodb.port=27017 spring.data.mongodb.database=users spring.data.mongodb.username=humble_freak spring.data.mongodb.password=freakone spring.rabbitmq.host=localhost spring.rabbitmq.username=guest spring.rabbitmq.password=guest spring.rabbitmq.port=5672 rabbitmq.publish=true 

Аналогично, мы можем написать application-prod.properties и application-qa.properties как много файлов свойств, которые мы хотим

затем напишите некоторые сценарии, чтобы запустить приложение для разных сред, например

 mvn spring-boot:run -Drun.profiles=local mvn spring-boot:run -Drun.profiles=qa mvn spring-boot:run -Drun.profiles=prod 

Я нашел это полезным примером:

 @RunWith(SpringRunner) @SpringBootTest(classes = [ TestConfiguration, MyApplication ], properties = [ "spring.config.name=application-MyTest_LowerImportance,application-MyTest_MostImportant" ,"debug=true", "trace=true" ] ) 

Здесь мы переопределяем использование «application.yml» для использования «application-MyTest_LowerImportance.yml», а также «application-MyTest_MostImportant.yml»,
(Spring также будет искать файлы .properties)

Кроме того, в качестве дополнительного бонуса предусмотрены параметры отладки и трассировки на отдельной строке, чтобы вы могли их прокомментировать, если это необходимо;]

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

 TRACE 93941 --- [ main] osbccConfigFileApplicationListener : Skipped config file 'file:./config/application-MyTest_MostImportant.properties' (file:./config/application-MyTest_MostImportant.properties) resource not found TRACE 93941 --- [ main] osbccConfigFileApplicationListener : Skipped config file 'file:./config/application-MyTest_MostImportant.xml' (file:./config/application-MyTest_MostImportant.xml) resource not found TRACE 93941 --- [ main] osbccConfigFileApplicationListener : Skipped config file 'file:./config/application-MyTest_MostImportant.yml' (file:./config/application-MyTest_MostImportant.yml) resource not found TRACE 93941 --- [ main] osbccConfigFileApplicationListener : Skipped config file 'file:./config/application-MyTest_MostImportant.yaml' (file:./config/application-MyTest_MostImportant.yaml) resource not found TRACE 93941 --- [ main] osbccConfigFileApplicationListener : Skipped config file 'file:./config/application-MyTest_LowerImportance.properties' (file:./config/application-MyTest_LowerImportance.properties) resource not found TRACE 93941 --- [ main] osbccConfigFileApplicationListener : Skipped config file 'file:./config/application-MyTest_LowerImportance.xml' (file:./config/application-MyTest_LowerImportance.xml) resource not found TRACE 93941 --- [ main] osbccConfigFileApplicationListener : Skipped config file 'file:./config/application-MyTest_LowerImportance.yml' (file:./config/application-MyTest_LowerImportance.yml) resource not found TRACE 93941 --- [ main] osbccConfigFileApplicationListener : Skipped config file 'file:./config/application-MyTest_LowerImportance.yaml' (file:./config/application-MyTest_LowerImportance.yaml) resource not found TRACE 93941 --- [ main] osbccConfigFileApplicationListener : Skipped config file 'file:./application-MyTest_MostImportant.properties' (file:./application-MyTest_MostImportant.properties) resource not found TRACE 93941 --- [ main] osbccConfigFileApplicationListener : Skipped config file 'file:./application-MyTest_MostImportant.xml' (file:./application-MyTest_MostImportant.xml) resource not found TRACE 93941 --- [ main] osbccConfigFileApplicationListener : Skipped config file 'file:./application-MyTest_MostImportant.yml' (file:./application-MyTest_MostImportant.yml) resource not found TRACE 93941 --- [ main] osbccConfigFileApplicationListener : Skipped config file 'file:./application-MyTest_MostImportant.yaml' (file:./application-MyTest_MostImportant.yaml) resource not found TRACE 93941 --- [ main] osbccConfigFileApplicationListener : Skipped config file 'file:./application-MyTest_LowerImportance.properties' (file:./application-MyTest_LowerImportance.properties) resource not found TRACE 93941 --- [ main] osbccConfigFileApplicationListener : Skipped config file 'file:./application-MyTest_LowerImportance.xml' (file:./application-MyTest_LowerImportance.xml) resource not found TRACE 93941 --- [ main] osbccConfigFileApplicationListener : Skipped config file 'file:./application-MyTest_LowerImportance.yml' (file:./application-MyTest_LowerImportance.yml) resource not found TRACE 93941 --- [ main] osbccConfigFileApplicationListener : Skipped config file 'file:./application-MyTest_LowerImportance.yaml' (file:./application-MyTest_LowerImportance.yaml) resource not found TRACE 93941 --- [ main] osbccConfigFileApplicationListener : Skipped config file 'classpath:/config/application-MyTest_MostImportant.properties' resource not found TRACE 93941 --- [ main] osbccConfigFileApplicationListener : Skipped config file 'classpath:/config/application-MyTest_MostImportant.xml' resource not found TRACE 93941 --- [ main] osbccConfigFileApplicationListener : Skipped config file 'classpath:/config/application-MyTest_MostImportant.yml' resource not found TRACE 93941 --- [ main] osbccConfigFileApplicationListener : Skipped config file 'classpath:/config/application-MyTest_MostImportant.yaml' resource not found TRACE 93941 --- [ main] osbccConfigFileApplicationListener : Skipped config file 'classpath:/config/application-MyTest_LowerImportance.properties' resource not found TRACE 93941 --- [ main] osbccConfigFileApplicationListener : Skipped config file 'classpath:/config/application-MyTest_LowerImportance.xml' resource not found TRACE 93941 --- [ main] osbccConfigFileApplicationListener : Skipped config file 'classpath:/config/application-MyTest_LowerImportance.yml' resource not found TRACE 93941 --- [ main] osbccConfigFileApplicationListener : Skipped config file 'classpath:/config/application-MyTest_LowerImportance.yaml' resource not found TRACE 93941 --- [ main] osbccConfigFileApplicationListener : Skipped config file 'classpath:/application-MyTest_MostImportant.properties' resource not found TRACE 93941 --- [ main] osbccConfigFileApplicationListener : Skipped config file 'classpath:/application-MyTest_MostImportant.xml' resource not found DEBUG 93941 --- [ main] osbccConfigFileApplicationListener : Loaded config file 'file:/Users/xxx/dev/myproject/target/test-classes/application-MyTest_MostImportant.yml' (classpath:/application-MyTest_MostImportant.yml) TRACE 93941 --- [ main] osbccConfigFileApplicationListener : Skipped config file 'classpath:/application-MyTest_MostImportant.yaml' resource not found TRACE 93941 --- [ main] osbccConfigFileApplicationListener : Skipped config file 'classpath:/application-MyTest_LowerImportance.properties' resource not found TRACE 93941 --- [ main] osbccConfigFileApplicationListener : Skipped config file 'classpath:/application-MyTest_LowerImportance.xml' resource not found DEBUG 93941 --- [ main] osbccConfigFileApplicationListener : Loaded config file 'file:/Users/xxx/dev/myproject/target/test-classes/application-MyTest_LowerImportance.yml' (classpath:/application-MyTest_LowerImportance.yml) TRACE 93941 --- [ main] osbccConfigFileApplicationListener : Skipped config file 'classpath:/application-MyTest_LowerImportance.yaml' resource not found TRACE 93941 --- [ main] osbccConfigFileApplicationListener : Skipped config file 'file:./config/application-MyTest_MostImportant-test.properties' (file:./config/application-MyTest_MostImportant-test.properties) resource not found 

Spring boot 1.X и Spring Boot 2.X не предоставляют одинаковые параметры и поведение в отношении Externalized Configuration .

Очень хороший ответ М. Дейна относится к особенностям Spring Boot 1.
Я буду обновлять для Spring Boot 2 здесь.

Источники и порядок окружающей среды

Spring Boot 2 использует очень специфический заказ PropertySource , который предназначен для разумного переопределения значений. Свойства рассматриваются в следующем порядке:

  • Свойства глобальных настроек Devtools в вашем домашнем каталоге (~ / .spring-boot-devtools.properties, когда devtools активен).

  • @TestPropertySource annotations на ваши тесты.

  • @SpringBootTest#properties атрибут annotations свойств для ваших тестов. Аргументы командной строки.

  • Свойства из SPRING_APPLICATION_JSON (встроенный JSON, встроенный в переменную среды или системное свойство).

  • Параметры init ServletConfig .

  • Параметры init ServletContext .

  • JNDI-атрибуты из java:comp/env .

  • Свойства Java-системы ( System.getProperties() ).

  • Переменные среды ОС.

  • Источник RandomValuePropertySource который имеет свойства только в случайном порядке. *.

  • Специфичные для приложения свойства приложения за пределами вашей упакованной банки ( application-{profile}.properties и варианты YAML).

  • Специфичные для приложения свойства приложения, упакованные внутри вашего jar ( application-{profile}.properties и варианты YAML).

  • Свойства приложения за пределами вашей упакованной банки (варианты application.properties и YAML).

  • Свойства приложения, упакованные внутри вашей банки (варианты application.properties и YAML).

  • @PropertySource для ваших @Configuration classов. Свойства по умолчанию (задаются установкой SpringApplication.setDefaultProperties ).

Для указания внешних файлов свойств эти параметры вам интересны:

  • Специфичные для приложения свойства приложения за пределами вашей упакованной банки ( application-{profile}.properties и варианты YAML).

  • Свойства приложения за пределами вашей упакованной банки (варианты application.properties и YAML).

  • @PropertySource для ваших @Configuration classов. Свойства по умолчанию (задаются установкой SpringApplication.setDefaultProperties ).

Вы можете использовать только один из этих 3 вариантов или объединить их в соответствии с вашими требованиями.
Например, для очень простых случаев достаточно использовать только специфичные для профиля свойства, но в других случаях вы можете использовать как свойства профиля, свойства по умолчанию, так и @PropertySource .

Расположение по умолчанию для файлов application.properties

О файлах application.properties (и варианте), по умолчанию Spring загружает их и добавляет их свойства в среду из них в следующем порядке:

  • Подкаталог A / config текущего каталога

  • Текущий каталог

  • Пакет classpath / config

  • Корень classа

Более высокие приоритеты настолько буквальны:
classpath:/,classpath:/config/,file:./,file:./config/ .

Как использовать файлы свойств с определенными именами?

Расположение по умолчанию не всегда достаточно: по умолчанию такие места, как имя файла по умолчанию ( application.properties ), могут не устраивать. Кроме того, как и в вопросе OP, вам может потребоваться указать несколько конфигурационных файлов, отличных от application.properties (и варианта).
Так что spring.config.name будет недостаточно.

В этом случае вы должны spring.config.location явное местоположение, используя свойство spring.config.location environment (которое представляет собой список местоположений каталога или путей к файлам, разделенным запятыми).
Чтобы получить бесплатную информацию о шаблоне имен файлов, используйте список путей к файлам в списке каталогов. Этот способ является самым многословным, но это также способ очень точно определить наши файлы конфигурации.

spring.config.location теперь заменяет места по умолчанию вместо добавления к ним

Кроме того, в Spring Boot 1 аргумент spring.config.location добавляет определенные местоположения в среду Spring.
Но из Spring Boot 2, spring.config.location заменяет местоположения по умолчанию, используемые Spring в указанных местах в среде Spring, как указано в документации .

Когда настраиваемые местоположения конфигурации настраиваются с помощью spring.config.location , они заменяют местоположение по умолчанию. Например, если spring.config.location настроен со значением classpath:/custom-config/ , file:./custom-config/ , порядок поиска будет следующим:

  1. file:./custom-config/

  2. classpath:custom-config/

spring.config.location теперь является способом убедиться, что файл application.properties должен быть явно указан.
Для uber JAR, которые не должны упаковывать файлы application.properties , это довольно приятно.

Чтобы сохранить прежнее поведение spring.config.location при использовании Spring Boot 2, вы можете использовать новое spring.config.additional-location вместо spring.config.location которое по-прежнему добавляет места, указанные в документации :

В качестве альтернативы, когда настраиваемые местоположения конфигурации настраиваются с использованием spring.config.additional-location , они используются в дополнение к местоположениям по умолчанию.


На практике

Предположим, что, как и в вопросе OP, у вас есть 2 файла внешних свойств для указания и 1 файл свойств, включенный в банку uber.

Чтобы использовать только файлы конфигурации, которые вы указали:

 -Dspring.config.location=classpath:job1.properties,classpath:job2.properties,classpath:/applications.properties 

Чтобы добавить в файлы конфигурации файлы конфигурации по умолчанию:

 -Dspring.config.additional-location=classpath:job1.properties,classpath:job2.properties 

classpath:/applications.properties здесь не требуется, поскольку по умолчанию это имеет место.

Модифицированная версия решения @mxsb, которая позволяет нам определять несколько файлов, и в моем случае это yml-файлы.

В моем приложении-dev.yml я добавил эту конфигурацию, которая позволяет мне вводить все yml, в которых есть -dev.yml. Это также может быть список определенных файлов. “Путь к classам: /test/test.yml,classpath: /test2/test.yml”

 application: properties: locations: "classpath*:/**/*-dev.yml" 

Это помогает получить карту свойств.

 @Configuration public class PropertiesConfig { private final static Logger LOG = LoggerFactory.getLogger(PropertiesConfig.class); @Value("${application.properties.locations}") private String[] locations; @Autowired private ResourceLoader rl; @Bean Map myProperties() { return stream(locations) .collect(toMap(filename -> filename, this::loadProperties)); } private Properties loadProperties(final String filename) { YamlPropertySourceLoader loader = new YamlPropertySourceLoader(); try { final Resource[] possiblePropertiesResources = ResourcePatternUtils.getResourcePatternResolver(rl).getResources(filename); final Properties properties = new Properties(); stream(possiblePropertiesResources) .filter(Resource::exists) .map(resource1 -> { try { return loader.load(resource1.getFilename(), resource1); } catch (IOException e) { throw new RuntimeException(e); } }).flatMap(l -> l.stream()) .forEach(propertySource -> { Map source = ((MapPropertySource) propertySource).getSource(); properties.putAll(source); }); return properties; } catch (IOException e) { throw new RuntimeException(e); } } } 

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

 config - application.yml - application-dev.yml - application-prod.yml management - management-dev.yml - management-prod.yml 

… вы получаете идею

Компонент немного отличается

 @Component public class PropertiesConfigurer extends PropertySourcesPlaceholderConfigurer implements EnvironmentAware, InitializingBean { private final static Logger LOG = LoggerFactory.getLogger(PropertiesConfigurer.class); private String[] locations; @Autowired private ResourceLoader rl; private Environment environment; @Override public void setEnvironment(Environment environment) { // save off Environment for later use this.environment = environment; super.setEnvironment(environment); } @Override public void afterPropertiesSet() throws Exception { // Copy property sources to Environment MutablePropertySources envPropSources = ((ConfigurableEnvironment) environment).getPropertySources(); envPropSources.forEach(propertySource -> { if (propertySource.containsProperty("application.properties.locations")) { locations = ((String) propertySource.getProperty("application.properties.locations")).split(","); stream(locations).forEach(filename -> loadProperties(filename).forEach(source ->{ envPropSources.addFirst(source); })); } }); } private List loadProperties(final String filename) { YamlPropertySourceLoader loader = new YamlPropertySourceLoader(); try { final Resource[] possiblePropertiesResources = ResourcePatternUtils.getResourcePatternResolver(rl).getResources(filename); final Properties properties = new Properties(); return stream(possiblePropertiesResources) .filter(Resource::exists) .map(resource1 -> { try { return loader.load(resource1.getFilename(), resource1); } catch (IOException e) { throw new RuntimeException(e); } }).flatMap(l -> l.stream()) .collect(Collectors.toList()); } catch (IOException e) { throw new RuntimeException(e); } } 

}

Я столкнулся с множеством проблем, пытаясь понять это. Вот моя настройка,

Dev Env: Windows 10, Java: 1.8.0_25, Spring Boot: 2.0.3.RELEASE, Spring: 5.0.7.RELEASE

То, что я нашел, – это весна, придерживающаяся концепции «Разумные настройки по умолчанию для конфигурации». Это означает, что вы должны иметь все свои файлы свойств как часть вашего военного файла. После этого вы можете переопределить их, используя свойство командной строки «-spring.config.additional-location», чтобы указать на внешние файлы свойств. Но это НЕ РАБОТАЕТ, если файлы свойств не являются частью исходного файла войны.

Демо-код: https://github.com/gselvara/spring-boot-property-demo/tree/master

  • Spring-Boot: Как установить свойства пула JDBC, например максимальное количество соединений?
  • Spring Boot, Spring Data JPA с несколькими источниками данных
  • Разверните Spring Boot для Tomcat
  • Добавить сервлет-фильтр в приложении Spring Boot
  • Как сообщить Spring Boot, какой основной class использовать для исполняемого банку?
  • Перечисление всех развернутых конечных точек restа (весенняя загрузка, трикотаж)
  • Возrotation объекта JSON в качестве ответа в Spring Boot
  • Ресурс API для облачных сообщений Firebase
  • Spring-Boot Jersey: разрешить Джерси обслуживать статический контент
  • Как настроить встроенный Tomcat, интегрированный с Spring, для прослушивания запросов на IP-адрес, кроме localhost?
  • java.lang.NoClassDefFoundError: org / springframework / core / env / ConfigurableEnvironment
  • Давайте будем гением компьютера.