Saya memiliki beberapa file properti yang ingin saya muat dari classpath. Ada satu set default /src/main/resources
yang merupakan bagian dari myapp.jar
. Saya springcontext
mengharapkan file berada di classpath. yaitu
<util:properties id="Job1Props"
location="classpath:job1.properties"></util:properties>
<util:properties id="Job2Props"
location="classpath:job2.properties"></util:properties>
Saya juga membutuhkan opsi untuk mengganti properti ini dengan set eksternal. Saya memiliki folder konfigurasi eksternal di cwd
. Sesuai boot musim semi, folder config doc harus ada di classpath. Tetapi tidak jelas dari doc apakah itu hanya akan menimpa applicaiton.properties
dari sana atau semua properti di config.
Saat saya mengujinya, hanya application.properties
diambil dan properti lainnya masih diambil /src/main/resources
. Saya telah mencoba menyediakannya sebagai daftar yang dipisahkan koma spring.config.location
tetapi set default masih tidak diganti.
Bagaimana cara membuat file konfigurasi eksternal mulitiple menggantikan file konfigurasi default?
Sebagai solusi, saya saat ini menggunakan app.config.location
(properti khusus aplikasi) yang saya suplai melalui baris perintah. yaitu
java -jar myapp.jar app.config.location=file:./config
dan saya mengubah saya applicationcontext
menjadi
<util:properties id="Job2Props"
location="{app.config.location}/job2.properties"></util:properties>
Dan inilah cara saya membuat pemisahan antara file dan classpath saat memuat Aplikasi.
EDIT:
//psuedo code
if (StringUtils.isBlank(app.config.location)) {
System.setProperty(APP_CONFIG_LOCATION, "classpath:");
}
Saya benar-benar ingin tidak menggunakan solusi di atas dan pegas akan menimpa semua file konfigurasi eksternal pada classpath seperti yang dilakukannya untuk application.properties
file tersebut.
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 siniJawaban:
Saat menggunakan Spring Boot, properti dimuat dalam urutan berikut (lihat Konfigurasi Eksternal di panduan referensi Spring Boot).
Saat menyelesaikan properti (yaitu,
@Value("${myprop}")
penyelesaian dilakukan dalam urutan terbalik (jadi dimulai dengan 9).Untuk menambahkan file yang berbeda, Anda dapat menggunakan
spring.config.location
properti yang mengambil daftar file properti atau lokasi file (direktori) yang dipisahkan koma.Yang di atas akan menambahkan direktori yang akan dikonsultasikan untuk
application.properties
file.Ini akan menambahkan 2 file properti ke file yang dimuat.
File dan lokasi konfigurasi default dimuat sebelum yang ditentukan secara tambahan,
spring.config.location
yang berarti bahwa yang terakhir akan selalu menimpa properti yang disetel di yang sebelumnya. (Lihat juga bagian ini dari Panduan Referensi Spring Boot).PEMBARUAN: Karena perilaku spring.config.location sekarang menimpa default daripada menambahkannya. Anda perlu menggunakan spring.config.additional-location untuk mempertahankan default. Ini adalah perubahan perilaku dari 1.x menjadi 2.x
sumber
application.properties
danapplication-[env].properties
. Itu tidak memperhitungkan file properti lainnya. Ini juga dinyatakan dalam panduan referensi (di bagian tautan mengarah ke dan kutipan dari panduan referensi).config.location
danconfig.names
berinteraksi, meskipun mungkin terlihat jelas bagi orang yang sudah tahu bagaimana mereka berinteraksi. Bisakah Anda memperbarui jawaban Anda untuk menambahkan sesuatu ke dokumentasi?spring.config.location
sekarang menggantikan default daripada menambahkannya. Anda perlu menggunakanspring.config.additional-location
untuk mempertahankan default. Ini adalah perubahan perilaku dari 1.x menjadi 2.x.Dengan boot Spring, spring.config.location berfungsi, cukup sediakan file properti yang dipisahkan koma.
lihat kode di bawah ini
seseorang dapat meletakkan versi default jdbc.properties di dalam aplikasi. Versi eksternal dapat diatur dengan ini.
Berdasarkan nilai profil yang ditetapkan menggunakan properti spring.profiles.active, nilai jdbc.host akan diambil. Jadi saat (di windows)
jdbc.host akan mengambil nilai dari jdbc-dev.properties.
untuk
jdbc.host akan mengambil nilai dari jdbc.properties.
sumber
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:Untuk menentukan file properti eksternal, opsi ini menarik minat Anda:
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 selainapplication.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:
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 .spring.config.location
sekarang menjadi cara untuk memastikan bahwaapplication.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 menggunakanspring.config.additional-location
properti baru alih-alihspring.config.location
yang masih menambahkan lokasi seperti yang dinyatakan oleh dokumentasi :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:
Untuk menambahkan file konfigurasi ke ini di lokasi default:
classpath:/applications.properties
pada contoh terakhir tidak diperlukan karena lokasi default memilikinya dan lokasi default di sini tidak ditimpa tetapi diperpanjang.sumber
application.properties
dengan semua parameter dan multipel${file_name}.properties
dengan kumpulan properti yang ditentukan sebagian. Jadi, jika Anda menggunakan@PropertySource
atau tautan kuat lainnya ke file, Anda dapat membuat file eksternal lain dan menimpa properti itu (Misalnya: dariclasspath:file.properties
).Lihatlah PropertyPlaceholderConfigurer, saya merasa lebih jelas untuk digunakan daripada anotasi.
misalnya
sumber
ini adalah salah satu pendekatan sederhana menggunakan sepatu bot musim semi
TestClass.java
yang app.properties konteks, dalam Anda lokasi yang dipilih
aplikasi boot musim semi Anda
dan konteks application.properties yang telah ditentukan sebelumnya
Anda dapat menulis kelas konfigurasi sebanyak yang Anda suka dan mengaktifkan / menonaktifkannya hanya dengan menyetel spring.profiles.active = nama / nama profil {dipisahkan dengan koma}
seperti yang Anda lihat, sepatu bot musim semi sangat bagus, hanya perlu beberapa saat untuk membiasakannya, perlu disebutkan bahwa Anda juga dapat menggunakan @Value di bidang Anda
sumber
Saya memiliki masalah yang sama. Saya ingin memiliki kemampuan untuk menimpa file konfigurasi internal saat startup dengan file eksternal, mirip dengan deteksi properti.aplikasi Spring Boot. Dalam kasus saya, ini adalah file user.properties tempat pengguna aplikasi saya disimpan.
Persyaratan saya:
Muat file dari lokasi berikut (dalam urutan ini)
Saya datang dengan solusi berikut:
Sekarang aplikasi menggunakan sumber daya classpath, tetapi memeriksa sumber daya di lokasi lain yang diberikan juga. Sumber daya terakhir yang ada akan diambil dan digunakan. Saya dapat memulai aplikasi saya dengan java -jar myapp.jar --properties.location = / directory / myproperties.properties untuk menggunakan lokasi properti yang mengapung perahu saya.
Detail penting di sini: Gunakan String kosong sebagai nilai default untuk properti.lokasi di anotasi @Value untuk menghindari kesalahan saat properti tidak disetel.
Ketentuan untuk properti.lokasi adalah: Gunakan direktori atau jalur ke file properti sebagai properti.lokasi.
Jika Anda hanya ingin mengganti properti tertentu, PropertiesFactoryBean dengan setIgnoreResourceNotFound (true) dapat digunakan dengan set larik sumber daya sebagai lokasi.
Saya yakin bahwa solusi ini dapat diperluas untuk menangani banyak file ...
EDIT
Di sini solusi saya untuk beberapa file :) Seperti sebelumnya, ini dapat digabungkan dengan PropertiesFactoryBean.
sumber
spring boot memungkinkan kita untuk menulis profil yang berbeda untuk menulis untuk lingkungan yang berbeda, misalnya kita dapat memiliki file properti terpisah untuk produksi, qa dan lingkungan lokal.
application-local.properties file dengan konfigurasi yang sesuai dengan mesin lokal saya
Demikian pula, kita dapat menulis application-prod.properties dan application-qa.properties sebanyak file properti yang kita inginkan
kemudian tulis beberapa skrip untuk memulai aplikasi untuk lingkungan yang berbeda, misalnya
sumber
Saya baru saja mengalami masalah yang mirip dengan ini dan akhirnya menemukan penyebabnya: file application.properties memiliki atribut kepemilikan dan rwx yang salah. Jadi ketika tomcat memulai, file application.properties berada di lokasi yang benar, tetapi dimiliki oleh pengguna lain:
sumber
Versi modifikasi dari solusi @mxsb yang memungkinkan kita untuk menentukan banyak file dan dalam kasus saya ini adalah file yml.
Di application-dev.yml saya, saya menambahkan konfigurasi ini yang memungkinkan saya memasukkan semua yml yang memiliki -dev.yml di dalamnya. Ini bisa menjadi daftar file tertentu juga. "jalur kelas: /test/test.yml,classpath: /test2/test.yml"
Ini membantu untuk mendapatkan peta properti.
Namun, jika seperti dalam kasus saya, saya ingin membagi file yml untuk setiap profil dan memuatnya dan menyuntikkannya langsung ke konfigurasi pegas sebelum inisialisasi kacang.
... Anda mengerti
Komponennya sedikit berbeda
}
sumber
Jika Anda ingin mengganti nilai yang ditentukan dalam file application.properties, Anda dapat mengubah profil aktif saat menjalankan aplikasi dan membuat file properti aplikasi untuk profil tersebut. Jadi, sebagai contoh, mari tentukan profil aktif "override" dan kemudian, dengan asumsi Anda telah membuat file properti aplikasi baru bernama "application-override.properties" di bawah / tmp, maka Anda dapat menjalankan
Nilai-nilai yang ditentukan dalam spring.config.location dievaluasi dalam urutan terbalik. Jadi, dalam contoh saya, classpat dievaluasi terlebih dahulu, lalu nilai file.
Jika file jar dan file "application-override.properties" ada di direktori saat ini, Anda sebenarnya dapat menggunakan
karena Spring Boot akan menemukan file properti untuk Anda
sumber
Saya telah menemukan ini menjadi pola yang berguna untuk diikuti:
Di sini kami mengganti penggunaan "application.yml" untuk menggunakan "application-MyTest_LowerImportance.yml" dan juga "application-MyTest_MostImportant.yml"
(Spring juga akan mencari file .properties)
Juga termasuk sebagai bonus tambahan adalah pengaturan debug dan jejak, pada baris terpisah sehingga Anda dapat mengomentarinya jika diperlukan;]
Debug / trace sangat berguna karena Spring akan membuang nama semua file yang dimuatnya dan yang dicoba dimuat.
Anda akan melihat baris seperti ini di konsol saat runtime:
sumber
Saya mengalami banyak masalah saat mencoba mencari tahu. Ini pengaturan saya,
Dev Env: Windows 10, Java: 1.8.0_25, Spring Boot: 2.0.3. RELEASE, Spring: 5.0.7. RELEASE
Apa yang saya temukan adalah musim semi menempel dengan konsep "Default yang masuk akal untuk konfigurasi". Ini diterjemahkan menjadi, Anda harus memiliki semua file properti Anda sebagai bagian dari file perang Anda. Setelah berada di sana, Anda dapat menimpanya menggunakan properti baris perintah "--spring.config.additional-location" untuk menunjuk ke file properti eksternal. Tetapi ini TIDAK AKAN BEKERJA jika file properti bukan bagian dari file perang asli.
Kode demo: https://github.com/gselvara/spring-boot-property-demo/tree/master
sumber