Весняне завантаження 1.X та Spring Boot 2.X не забезпечують однакових варіантів та поведінки щодо Externalized Configuration
.
Дуже гарна відповідь М. Deinum стосується особливостей Spring Boot 1.
Я оновлю для Spring Boot 2 тут.
Джерела та порядок властивостей навколишнього середовища
Spring Boot 2 використовує дуже особливий PropertySource
порядок, розроблений для забезпечення розумного переосмислення значень. Властивості розглядаються в наступному порядку:
Властивості глобальних налаштувань Devtools у вашому домашньому каталозі (~ / .spring-boot-devtools.properties, коли devtools активний).
@TestPropertySource
анотації на ваших тестах.
@SpringBootTest#properties
атрибут анотації на ваших тестах. Аргументи командного рядка.
Властивості з SPRING_APPLICATION_JSON
(вбудований JSON вбудований у змінну середовища або властивість системи).
ServletConfig
параметри init.
ServletContext
параметри init.
Атрибути JNDI від java:comp/env
.
Властивості системи Java ( System.getProperties()
).
Змінні середовища ОС.
A, RandomValuePropertySource
що має властивості лише випадковим чином. *
Властивості програми, що стосуються профілю, поза вашою упакованою баночкою ( application-{profile}.properties
та варіантами YAML).
Властивості програми, специфічні для профілю, упаковані всередині вашої банки ( application-{profile}.properties
та варіанти YAML).
Властивості програми за межами вашої упакованої банки ( application.properties
та варіантів YAML).
Властивості програми, упаковані всередині вашої банки ( application.properties
та варіанти YAML).
@PropertySource
анотації на ваших @Configuration
заняттях. Властивості за замовчуванням (задаються налаштуваннями
SpringApplication.setDefaultProperties
).
Щоб вказати файли зовнішніх властивостей, ці параметри повинні вас зацікавити:
Властивості програми, що стосуються профілю, поза вашою упакованою баночкою ( application-{profile}.properties
та варіантами YAML).
Властивості програми за межами вашої упакованої банки ( application.properties
та варіантів YAML).
@PropertySource
анотації на ваших @Configuration
заняттях. Властивості за замовчуванням (задаються налаштуваннями
SpringApplication.setDefaultProperties
).
Ви можете використовувати лише один із цих 3 варіантів або комбінувати їх відповідно до своїх вимог.
Наприклад, для дуже простих випадків, що використовують лише властивості, характерні для профілю, достатньо, але в інших випадках ви можете використовувати як властивості, характерні для профілю, так і властивості за замовчуванням @PropertySource
.
Місце за замовчуванням для файлів application.properties
Про application.properties
файли (і варіант) за замовчуванням Spring завантажує їх і додає їх властивості в середовище з них у такому порядку:
Вищі пріоритети настільки буквально:
classpath:/,classpath:/config/,file:./,file:./config/
.
Як використовувати файли властивостей із конкретними іменами?
Місце розташування за замовчуванням не завжди достатньо: місця за замовчуванням, такі як назва файлу за замовчуванням ( application.properties
), можуть не відповідати. Крім того, як і у запитанні про ОП, вам може знадобитися вказати кілька файлів конфігурації, окрім 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
, вони використовуються на додаток до стандартних місць.
На практиці
Отже, припустимо, що як і у запитанні про ОП, у вас є 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
в останньому прикладі не потрібно, оскільки локації за замовчуванням мають це, і що типові місця тут не перезаписані, а розширені.
application.properties
Завжди буде завантажений, зspring.config.location
ви можете додати додаткові місця конфігурації, які перевіряються для файлів (тобто , коли він закінчується з/
) , однак , якщо ви поставите запитом список там , що вказує на файли ті будуть завантажені. Це також пояснено у Посібнику з весняних завантажень тут