के साथ लॉन्च स्प्रिंग-बूट (प्रोफ़ाइल-विशिष्ट) एप्लिकेशन में अनुप्रयोग गुणों को ओवरराइड करना जारी करना मुझे क्लासपाथ पर प्रोफ़ाइल-विशिष्ट अनुप्रयोग गुण फ़ाइल में घोषित संपत्ति को ओवरराइड करने का प्रयास करने में कठिनाई हो रही है जिसमें किसी अन्य घोषित घोषित किया गया है फाइल सिस्टम पर फाइल ओवरराइड करता है।PropertiesLauncher - SOLVED
मैं (कि @EnableAutoconfiguration
का उपयोग कर, है) एकाधिक प्रोफाइल, जो मैं PropertiesLauncher
बल्कि JarLauncher
से (तैनाती की कमी साथ क्या करने वाले कारण का उपयोग कर लॉन्च किया है कि एक ऑटो-विन्यस्त स्प्रिंग-बूट आवेदन है - क्या मैं एक विस्फोट को तैनात करने की जरूरत है । एक संग्रह निर्देशिका के बजाय एक में केवल पढ़ने के लिए फाइल सिस्टम)
अपने आवेदन की जड़ के भीतर, मैं उदाहरण के लिए, कुछ प्रोफ़ाइल विशिष्ट आवेदन गुण होते हैं:
application-dev.properties
application-qa.properties
application-prd.properties
और मान लें, तर्क की खातिर कि application-dev.properties
शामिल:
foo.bar=baz
foo.baz=other
किसी भी पर्यावरण के लिए, यह एक मौजूदा संपत्ति ओवरराइड करने के लिए, साथ ही आपूर्ति आवश्यक हो सकता है एक अनुपस्थित एक (एक उत्पादन पासवर्ड की तरह, उदाहरण के लिए) , और जो मुद्दा मैं देख रहा हूं वह क्लासपाथ पर application-${profile}.properties
फ़ाइल में पहले से घोषित ओवरराइडिंग गुणों के साथ है। (आपूर्ति गुण classpath फ़ाइल में मौजूद नहीं ठीक है, इस मुद्दा नहीं है काम करता है।)
मैं एक ओवरराइड गुण जैसे एक फाइल सिस्टम स्थान में दायर करवाना कहते हैं:
/local/appname/dev/overrides/application.properties
और मैं चाहता हूँ संपत्ति को ओवरराइड करने के लिए, foo.bar
, साथ ही साथ एक नई संपत्ति घोषित करें, foo.password
।
इसलिए ओवरराइड फ़ाइल की सामग्री हैं:
java -Dspring.config.location=file:/local/appname/dev/overrides/
-Dspring.profiles.active=dev
org.springframework.boot.loader.PropertiesLauncher
--debug &
मुद्दा मैं देख रहा हूँ, हालांकि वह यह है कि:
foo.bar=overridden-value
foo.password=something
जब मैं आवेदन शुरू, मैं इस तरह एक कमांड लाइन कुछ का उपयोग foo.password
, संपत्ति नहींapplication-dev.properties
फ़ाइल है में घोषित baz
application-dev.properties
से नहीं बल्कि मूल्य से, overridden-value
/local/appname/dev/overrides/application.properties
से मैं अभी भी इसका महत्व समझते हैं, - उठाया, foo.bar
की ओवरराइड नजरअंदाज कर दिया है।
--debug
विकल्प सक्षम होने पर, मुझे लगता है कि आदेश में ConfigFileApplicationListener
लॉगिंग है कि यह दोनों ओवरराइड फ़ाइल लोड हो जाए (फाइल सिस्टम से) और (classpath से) प्रोफ़ाइल विशिष्ट फ़ाइल, देख सकते हैं।
मैं शायद इस निष्कर्ष पर निष्कर्ष निकाला हूं कि ओवरराइड फ़ाइल पहले सूचीबद्ध है, इसे पहले लोड किया जा रहा है, फिर क्लासपाथ से 'डिफ़ॉल्ट' प्रोफ़ाइल-विशिष्ट फ़ाइल द्वारा ओवरराइड किया गया है, जो बाद में सूचीबद्ध है।हालांकि, मैं सराहना करता हूं कि लॉग में लिस्टिंग का क्रम आवश्यक व्यवहार से संबंधित नहीं है। और मैंने spring.config.location
संपत्ति पर घोषित पथों के क्रम को बदलने की कोशिश की है, ताकि classpath:
file:...
से पहले सूचीबद्ध हो लेकिन इससे मदद नहीं मिली है और मुझे यह विश्वास नहीं होगा कि वसंत-बूट दस्तावेज़ स्पष्ट रूप से बताता है कि डिफ़ॉल्ट गुण स्थान हमेशा खोजे जाते हैं भले ही आप spring.config.location
के लिए कोई मूल्य प्रदान करते हैं।
- कमांड लाइन तर्क:
स्प्रिंग-बूट प्रलेखन आदेश है कि गुण वरीयता का अवरोही क्रम , एक स्प्रिंग-बूट निष्पादन योग्य जार के लिए हल कर रहे हैं के बारे में बहुत विशिष्ट है।
- जावा सिस्टम गुण (
System.getProperties()
)। - ओएस पर्यावरण चर।
- JNDI से
java:comp/env
- एक
RandomValuePropertySource
केवलrandom.*
में गुण है कि जिम्मेदार बताते हैं। - आवेदन गुण अपने पैक जार के बाहर (
application.properties
YAML और प्रोफ़ाइल वेरिएंट सहित)। - आवेदन गुण (YAML और प्रोफ़ाइल वेरिएंट सहित
application.properties
) पैक के अंदर अपने जार। @PropertySource
आपके@Configuration
कक्षाओं पर एनोटेशन।- डिफ़ॉल्ट गुण (
SpringApplication.setDefaultProperties
का उपयोग करके निर्दिष्ट)। गुण बाहर से अधिक संपत्तियों अंदर अपने जार - लाइनों 6 और 7 के
लें टिप्पणी।
क्या कहा गया है नहीं कर रहा है, जहाँ तक मैं देख सकता हूँ, और मेरे भ्रम की स्थिति/मुद्दे का स्रोत हो सकता है, जो क्या होता है जब आप नहीं रहे एक जार लेकिन एक विस्फोट निर्देशिका (और इसलिए PropertiesLauncher
उपयोग कर रहा है ।)
तो एक विस्फोट निर्देशिका के व्यवहार क्या एक जार के लिए कहा गया के साथ संगत कर रहे थे, मैं उम्मीद थी कि /local/appname/dev/overrides/application.properties
में घोषित संपत्तियों के मूल्यों में एक ही नाम classpath:application-dev.properties
में घोषित की किसी भी ओवरराइड होगा, लेकिन यह नहीं है ऐसा लगता है प्रतीत होता है।
इसके अलावा वसंत-बूट प्रलेखन (PropertiesLauncher
पर परिशिष्ट C.4) से विख्यात loader.home
संपत्ति है, जो 'के रूप में ... [यह] अतिरिक्त गुणों का स्थान फाइल, जैसे वर्णन किया गया है का उल्लेख है/opt/app
(${user.dir}
पर डिफ़ॉल्ट) '।
इसलिए मैंने spring.config.location
के बजाय loader.home
का उपयोग करने का प्रयास किया, लेकिन इसका कोई फायदा नहीं हुआ।
(अद्यतन: मैं भी loader.config.location
उपयोग करने की कोशिश और मैं दो नोट: (ताकि अपने व्यवहार है यह बजाय एक निर्देशिका की तुलना में एक फ़ाइल चाहते करने लगता है spring.config.location
साथ अनुरूप नहीं), और जब मैं किया आपूर्ति मूल निर्देशिका के बजाए एक फ़ाइल पथ, यह अभी भी मदद नहीं करता है।)
क्या कोई यह बता सकता है कि मैं क्या गलत कर रहा हूं, या मैं क्या गलत धारणा बना रहा हूं?
मुझे लगता है कि प्रोफ़ाइल-विशिष्ट गुण हमेशा प्राथमिकता लेते हैं। क्या आपने स्थानीय 'एप्लिकेशन-देव.प्रोपर्टीज' का प्रयास किया था? –
@ डेव - मैंने उन सभी चीजों की कोशिश की है जिन पर चर्चा की गई है। क्या आप मदद कर सकते हैं? मेरा सवाल - http://stackoverflow.com/questions/36635163/spring-boot-externalizing-properties-not-working/36635367?noredirect=1#comment60919038_36635367 – Shiv