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 аннотации к вашим тестам.
@SpringBootTest#propertiesаннотации в ваших тестах. Аргументы командной строки.
Свойства из SPRING_APPLICATION_JSON(встроенный JSON, встроенный в переменную среды или системное свойство).
ServletConfig параметры инициализации.
ServletContext параметры инициализации.
Атрибуты JNDI из java:comp/env.
Свойства системы Java ( System.getProperties()).
Переменные среды ОС.
Объект, RandomValuePropertySourceкоторый имеет свойства только в случайном порядке. *.
Свойства приложения, зависящие от профиля, за пределами вашего упакованного jar ( application-{profile}.propertiesи вариантов YAML).
Зависящие от профиля свойства приложения, упакованные внутри вашего jar-файла ( application-{profile}.propertiesи варианты YAML).
Свойства приложения за пределами вашего упакованного jar ( application.propertiesи вариантов YAML).
Свойства приложения, упакованные внутри вашего jar-файла ( application.propertiesи варианты YAML).
@PropertySourceаннотации к вашим @Configurationклассам. Свойства по умолчанию (задаются настройкой
SpringApplication.setDefaultProperties).
Чтобы указать файлы внешних свойств, эти параметры должны вас заинтересовать:
Свойства приложения, зависящие от профиля, за пределами вашего упакованного jar ( application-{profile}.propertiesи вариантов YAML).
Свойства приложения за пределами вашего упакованного jar ( application.propertiesи вариантов YAML).
@PropertySourceаннотации к вашим @Configurationклассам. Свойства по умолчанию (задаются настройкой
SpringApplication.setDefaultProperties).
Вы можете использовать только один из этих 3 вариантов или комбинировать их в соответствии с вашими требованиями.
Например, для очень простых случаев достаточно использовать только свойства, специфичные для профиля, но в других случаях вы можете использовать как свойства, специфичные для профиля, свойства по умолчанию и @PropertySource.
Расположение по умолчанию для файлов application.properties
Что application.propertiesкасается файлов (и варианта), по умолчанию Spring загружает их и добавляет их свойства в среду из них в следующем порядке:
Высшие приоритеты так буквально:
classpath:/,classpath:/config/,file:./,file:./config/.
Как использовать файлы свойств с определенными именами?
Места по умолчанию не всегда достаточно: места по умолчанию, такие как имя файла по умолчанию ( application.properties), могут не подходить. Кроме того, как и в вопросе OP, вам может потребоваться указать несколько файлов конфигурации, кроме application.properties(и варианта).
Так spring.config.nameчто будет мало.
В этом случае вы должны указать точное местоположение с помощью spring.config.locationсвойства среды (которое представляет собой список разделенных запятыми местоположений каталогов или путей к файлам).
Чтобы не беспокоиться о шаблоне имен файлов, предпочтите список путей к файлам списку каталогов.
Например, вот так:
java -jar myproject.jar --spring.config.location=classpath:/default.properties,classpath:/override.properties
Это наиболее подробный способ указания папки, но это также способ очень точно указать наши файлы конфигурации и четко задокументировать эффективно используемые свойства.
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/порядок поиска становится следующим:
file:./custom-config/
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 jar.
Чтобы использовать только указанные вами файлы конфигурации:
-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 в последнем примере не требуется, поскольку он есть в расположениях по умолчанию, и эти расположения по умолчанию здесь не перезаписываются, а расширяются.
application.propertiesвсегда будут загружаться, иspring.config.locationвы можете добавить дополнительные местоположения конфигурации, которые проверяются на наличие файлов (то есть, когда он заканчивается на a/), однако, если вы поместите туда список, разделенный запятыми, который указывает на файлы, которые будут загружены. Это также объясняется в Справочном руководстве по Spring Boot здесь