Spring boot 1.X i Spring Boot 2.X nie zapewniają tych samych opcji i zachowania w przypadku Externalized Configuration
.
Bardzo dobra odpowiedź M. Deinum odnosi się do specyfiki Spring Boot 1.
Zaktualizuję tutaj Spring Boot 2.
Źródła i porządek właściwości środowiska
Spring Boot 2 używa bardzo szczególnej PropertySource
kolejności, która umożliwia rozsądne zastępowanie wartości. Właściwości są rozpatrywane w następującej kolejności:
Właściwości globalnych ustawień Devtools w katalogu domowym (~ / .spring-boot-devtools.properties, gdy devtools jest aktywne).
@TestPropertySource
adnotacje na temat twoich testów.
@SpringBootTest#properties
atrybut adnotacji w twoich testach. Argumenty wiersza poleceń.
Właściwości z SPRING_APPLICATION_JSON
(wbudowane JSON osadzone w zmiennej środowiskowej lub właściwości systemowej).
ServletConfig
parametry init.
ServletContext
parametry init.
Atrybuty JNDI z java:comp/env
.
Właściwości systemu Java ( System.getProperties()
).
Zmienne środowiskowe systemu operacyjnego.
A, RandomValuePropertySource
który ma właściwości tylko losowo. *.
Właściwości aplikacji specyficzne dla profilu poza opakowanym słoikiem ( application-{profile}.properties
i warianty YAML).
Właściwości aplikacji specyficzne dla profilu spakowane w Twoim słoiku ( application-{profile}.properties
i warianty YAML).
Właściwości aplikacji poza opakowanym słoikiem ( application.properties
i warianty YAML).
Właściwości aplikacji zapakowane w słoiku ( application.properties
i warianty YAML).
@PropertySource
adnotacje na Twoich @Configuration
zajęciach. Właściwości domyślne (określone przez ustawienie
SpringApplication.setDefaultProperties
).
Aby określić zewnętrzne pliki właściwości, te opcje powinny Cię zainteresować:
Właściwości aplikacji specyficzne dla profilu poza opakowanym słoikiem ( application-{profile}.properties
i warianty YAML).
Właściwości aplikacji poza opakowanym słoikiem ( application.properties
i warianty YAML).
@PropertySource
adnotacje na Twoich @Configuration
zajęciach. Właściwości domyślne (określone przez ustawienie
SpringApplication.setDefaultProperties
).
Możesz użyć tylko jednej z tych 3 opcji lub połączyć je zgodnie z własnymi wymaganiami.
Na przykład w bardzo prostych przypadkach wystarczy użyć tylko właściwości specyficznych dla profilu, ale w innych przypadkach możesz chcieć użyć zarówno właściwości specyficznych dla profilu, właściwości domyślnych i @PropertySource
.
Domyślne lokalizacje plików application.properties
O application.properties
plikach (i wariantach), domyślnie Spring ładuje je i dodaje ich właściwości w środowisku z nich w następującej kolejności:
Podkatalog / config bieżącego katalogu
Bieżący katalog
Pakiet classpath / config
Katalog główny ścieżki klas
Wyższe priorytety są więc dosłownie:
classpath:/,classpath:/config/,file:./,file:./config/
.
Jak używać plików właściwości o określonych nazwach?
Domyślne lokalizacje nie zawsze są wystarczające: domyślne lokalizacje, takie jak domyślna nazwa pliku ( application.properties
), mogą nie pasować. Poza tym, podobnie jak w przypadku pytania OP, może być konieczne określenie wielu plików konfiguracyjnych innych niż application.properties
(i wariant).
Więcspring.config.name
to nie wystarczy.
W takim przypadku należy podać jawną lokalizację przy użyciu spring.config.location
właściwości environment (czyli rozdzielonej przecinkami listy lokalizacji katalogów lub ścieżek plików).
Aby być wolnym w kwestii wzorców nazw plików, przedkładaj listę ścieżek plików nad listę katalogów.
Na przykład zrób tak:
java -jar myproject.jar --spring.config.location=classpath:/default.properties,classpath:/override.properties
W ten sposób jest to najbardziej rozwlekłe określenie folderu, ale jest to również sposób bardzo dokładnego określenia naszych plików konfiguracyjnych i jasnego udokumentowania efektywnie używanych właściwości.
spring.config.location zastępuje teraz domyślne lokalizacje zamiast je dodawać
W przypadku Spring Boot 1 spring.config.location
argument dodaje określone lokalizacje w środowisku Spring.
Ale z Spring Boot 2, spring.config.location
zastępuje domyślne lokalizacje używane przez Spring przez określone lokalizacje w środowisku Spring, zgodnie z dokumentacją .
Gdy niestandardowe lokalizacje konfiguracji są konfigurowane przy użyciu
spring.config.location
, zastępują domyślne lokalizacje. Na przykład, jeśli spring.config.location
skonfigurowano z wartością
classpath:/custom-config/
, file:./custom-config/
kolejność wyszukiwania będzie następująca:
file:./custom-config/
classpath:custom-config/
spring.config.location
jest teraz sposobem na upewnienie się, że każdy application.properties
plik musi być jawnie określony.
Dla plików JAR Uber, które nie powinny być pakowaneapplication.properties
plików plików, jest to raczej miłe.
Aby zachować stare zachowanie spring.config.location
podczas korzystania z Spring Boot 2, możesz użyć nowej spring.config.additional-location
właściwości zamiast spring.config.location
nadal dodawać lokalizacje zgodnie z dokumentacją :
Alternatywnie, gdy niestandardowe lokalizacje konfiguracji są konfigurowane przy użyciu
spring.config.additional-location
, są one używane oprócz lokalizacji domyślnych.
W praktyce
Załóżmy więc, że tak jak w przypadku pytania OP, masz 2 zewnętrzne pliki właściwości do określenia i 1 plik właściwości zawarty w pliku uber jar.
Aby używać tylko określonych plików konfiguracyjnych:
-Dspring.config.location=classpath:/job1.properties,classpath:/job2.properties,classpath:/applications.properties
Aby dodać do nich pliki konfiguracyjne w domyślnych lokalizacjach:
-Dspring.config.additional-location=classpath:/job1.properties,classpath:/job2.properties
classpath:/applications.properties
w ostatnim przykładzie nie jest wymagane, ponieważ domyślne lokalizacje to mają i te domyślne lokalizacje nie są tutaj nadpisywane, ale rozszerzane.
application.properties
Zawsze będzie załadowany, zespring.config.location
można dodać dodatkowe lokalizacje konfiguracyjnych, które są zaznaczone pliki (czyli gdy kończy się/
), jednakże jeśli umieścisz oddzielone przecinkami listę tam co wskazuje na pliki te zostaną załadowane. Jest to również wyjaśnione w przewodniku Spring Boot Reference tutaj