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 PropertySourceurutan 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#propertiesatribut 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 RandomValuePropertySourceyang memiliki properti hanya secara acak. *.
Properti aplikasi khusus profil di luar tabung paket Anda ( application-{profile}.propertiesdan varian YAML).
Properti aplikasi khusus profil yang dikemas di dalam jar Anda ( application-{profile}.propertiesdan varian YAML).
Properti aplikasi di luar tabung paket Anda ( application.propertiesdan varian YAML).
Properti aplikasi yang dikemas di dalam jar Anda ( application.propertiesdan varian YAML).
@PropertySourcepenjelasan tentang @Configurationkelas 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}.propertiesdan varian YAML).
Properti aplikasi di luar tabung paket Anda ( application.propertiesdan varian YAML).
@PropertySourcepenjelasan tentang @Configurationkelas 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.propertiesfile (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.nametidak akan cukup.
Dalam kasus ini Anda harus menyediakan lokasi eksplisit dengan menggunakan spring.config.locationproperti 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.locationargumen menambahkan lokasi tertentu di lingkungan Spring.
Tapi dari Spring Boot 2, spring.config.locationmenggantikan 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.locationdikonfigurasi dengan nilai``
classpath:/custom-config/, file:./custom-config/urutan pencarian menjadi sebagai berikut:
file:./custom-config/
classpath:custom-config/
spring.config.locationsekarang menjadi cara untuk memastikan bahwa application.propertiesfile apa pun harus ditentukan secara eksplisit.
Untuk uber JAR yang tidak seharusnya mengemas application.propertiesfile, itu cukup bagus.
Untuk menjaga perilaku lama spring.config.locationsaat menggunakan Spring Boot 2 Anda dapat menggunakan spring.config.additional-locationproperti baru alih-alih spring.config.locationyang 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.propertiesakan selalu dimuat, denganspring.config.locationAnda 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