Spring boot 1.X dan Spring Boot 2.X tidak memberikan opsi dan perilaku yang sama tentang file Externalized Configuration
.
Jawaban yang sangat bagus dari M. Deinum mengacu pada spesifikasi Spring Boot 1.
Saya akan memperbarui untuk Spring Boot 2 di sini.
Sumber dan keteraturan properti lingkungan
Spring Boot 2 menggunakan PropertySource
urutan yang sangat khusus yang dirancang untuk memungkinkan pengesampingan nilai yang masuk akal. Properti dipertimbangkan dalam urutan berikut:
Properti pengaturan global Devtools di direktori home Anda (~ / .spring-boot-devtools.properties saat devtools aktif).
@TestPropertySource
anotasi pada pengujian Anda.
@SpringBootTest#properties
atribut annotation pada pengujian Anda. Argumen baris perintah.
Properti dari SPRING_APPLICATION_JSON
(JSON sebaris yang disematkan dalam variabel lingkungan atau properti sistem).
ServletConfig
parameter init.
ServletContext
parameter init.
Atribut JNDI dari java:comp/env
.
Properti Sistem Java ( System.getProperties()
).
Variabel lingkungan OS.
A RandomValuePropertySource
yang memiliki properti hanya secara acak. *.
Properti aplikasi khusus profil di luar tabung paket Anda ( application-{profile}.properties
dan varian YAML).
Properti aplikasi khusus profil yang dikemas di dalam jar Anda ( application-{profile}.properties
dan varian YAML).
Properti aplikasi di luar tabung paket Anda ( application.properties
dan varian YAML).
Properti aplikasi yang dikemas di dalam jar Anda ( application.properties
dan varian YAML).
@PropertySource
penjelasan tentang @Configuration
kelas Anda . Properti default (ditentukan oleh pengaturan
SpringApplication.setDefaultProperties
).
Untuk menentukan file properti eksternal, opsi ini menarik minat Anda:
Properti aplikasi khusus profil di luar tabung paket Anda ( application-{profile}.properties
dan varian YAML).
Properti aplikasi di luar tabung paket Anda ( application.properties
dan varian YAML).
@PropertySource
penjelasan tentang @Configuration
kelas Anda . Properti default (ditentukan oleh pengaturan
SpringApplication.setDefaultProperties
).
Anda hanya dapat menggunakan salah satu dari 3 opsi ini atau menggabungkannya sesuai dengan kebutuhan Anda.
Misalnya untuk kasus yang sangat sederhana dengan hanya menggunakan properti khusus profil saja sudah cukup, tetapi dalam kasus lain Anda mungkin ingin menggunakan properti khusus profil, properti default dan @PropertySource
.
Lokasi default untuk file application.properties
Tentang application.properties
file (dan varian), secara default Spring memuatnya dan menambahkan propertinya di lingkungan dari ini dalam urutan berikut:
Prioritas yang lebih tinggi begitu harfiah:
classpath:/,classpath:/config/,file:./,file:./config/
.
Bagaimana cara menggunakan file properti dengan nama tertentu?
Lokasi default tidak selalu cukup: lokasi default seperti nama file default ( application.properties
) mungkin tidak cocok. Selain itu, seperti dalam pertanyaan OP, Anda mungkin perlu menentukan beberapa file konfigurasi selain application.properties
(dan varian).
Jadi spring.config.name
tidak akan cukup.
Dalam kasus ini Anda harus menyediakan lokasi eksplisit dengan menggunakan spring.config.location
properti lingkungan (yang merupakan daftar lokasi direktori atau jalur file yang dipisahkan koma).
Untuk bebas tentang pola nama file, pilih daftar jalur file di atas daftar direktori.
Misalnya lakukan seperti itu:
java -jar myproject.jar --spring.config.location=classpath:/default.properties,classpath:/override.properties
Cara itu adalah yang paling verbose yang hanya menentukan folder tetapi juga cara untuk menentukan file konfigurasi kita dan untuk mendokumentasikan dengan jelas properti yang digunakan secara efektif.
spring.config.location sekarang menggantikan lokasi default alih-alih menambahkannya
Dengan Spring Boot 1, spring.config.location
argumen menambahkan lokasi tertentu di lingkungan Spring.
Tapi dari Spring Boot 2, spring.config.location
menggantikan lokasi default yang digunakan oleh Spring dengan lokasi yang ditentukan di lingkungan Spring seperti yang dinyatakan dalam dokumentasi .
Saat lokasi konfigurasi kustom dikonfigurasi dengan menggunakan
spring.config.location
, lokasi default akan diganti. Misalnya, jika spring.config.location
dikonfigurasi dengan nilai``
classpath:/custom-config/
, file:./custom-config/
urutan pencarian menjadi sebagai berikut:
file:./custom-config/
classpath:custom-config/
spring.config.location
sekarang menjadi cara untuk memastikan bahwa application.properties
file apa pun harus ditentukan secara eksplisit.
Untuk uber JAR yang tidak seharusnya mengemas application.properties
file, itu cukup bagus.
Untuk menjaga perilaku lama spring.config.location
saat menggunakan Spring Boot 2 Anda dapat menggunakan spring.config.additional-location
properti baru alih-alih spring.config.location
yang masih menambahkan lokasi seperti yang dinyatakan oleh dokumentasi :
Alternatifnya, saat lokasi konfigurasi kustom dikonfigurasikan dengan menggunakan
spring.config.additional-location
, lokasi tersebut digunakan selain lokasi default.
Dalam praktek
Jadi misalkan seperti dalam pertanyaan OP, Anda memiliki 2 file properti eksternal untuk ditentukan dan 1 file properti disertakan dalam uber jar.
Untuk menggunakan hanya file konfigurasi yang Anda tentukan:
-Dspring.config.location=classpath:/job1.properties,classpath:/job2.properties,classpath:/applications.properties
Untuk menambahkan file konfigurasi ke ini di lokasi default:
-Dspring.config.additional-location=classpath:/job1.properties,classpath:/job2.properties
classpath:/applications.properties
pada contoh terakhir tidak diperlukan karena lokasi default memilikinya dan lokasi default di sini tidak ditimpa tetapi diperpanjang.
application.properties
akan selalu dimuat, denganspring.config.location
Anda dapat menambahkan lokasi konfigurasi tambahan yang diperiksa untuk file (yaitu ketika diakhiri dengan a/
) namun jika Anda meletakkan daftar yang dipisahkan koma di sana yang menunjuk ke file yang akan dimuat. Ini juga dijelaskan dalam Panduan Referensi Sepatu Musim Semi di sini