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 здесь