स्प्रिंग बूट अनुप्रयोग में पर्यावरण विशिष्ट अनुप्रयोग।


85

मेरे स्प्रिंग बूट एप्लिकेशन में, मैं पर्यावरण विशिष्ट गुण फ़ाइल बनाना चाहता हूं। युद्ध में मेरे आवेदन का पैकेजिंग प्रकार और मैं इसे एम्बेडेड टोमैट में निष्पादित कर रहा हूं। मैं sts का उपयोग करता हूँ और sts से ही मुख्य निष्पादित करता हूँ।

  1. क्या मेरे पास एप्लिकेशन जैसे पर्यावरण विशिष्ट गुण फ़ाइल हो सकते हैं - $ {env-value} .properties?

उपरोक्त मामले में, env-value में स्थानीय / devl / परीक्षण / ठेस के रूप में मान होंगे

  1. Env-value फ़ाइल कहाँ सेट करें? स्थानीय के लिए, मैं इसे अनुसूचित जनजाति के माध्यम से jvm तर्क के रूप में सेट कर सकता हूं

  2. जो स्प्रिंग बूट एप्लिकेशन में एप्लीकेशन.प्रोस्पेर्टी को पढ़ता है।

  3. पर्यावरण विशिष्ट गुण फ़ाइल लोड करने के लिए कैसे? पूर्व के लिए - अगर मैं पर्यावरण विशिष्ट संपत्ति फ़ाइल में डेटाबेस यूआईडी, पीडीडब्ल्यू, स्कीमा आदि सेट करता हूं, तो क्या उस स्थिति में डेटा स्रोत इसमें गुणों को समझ पाएंगे?

  4. क्या मैं एक ही समय में application.properties और application-local.properties फ़ाइल का उपयोग कर सकता हूं?


आप पढ़ा है यह ? यह मूल रूप से आउट-ऑफ-द-बॉक्स समर्थित है।
एम। डिनम

मैंने किया लेकिन वह काम नहीं कर रहा है। तो मैं एक ही स्थान पर application.properties फ़ाइल और अनुप्रयोग-local.properties फ़ाइल है। application-local.properties फ़ाइल में db संबंधित गुण होते हैं। application.properties में स्प्रिंग mvc के संबंध में एक एकल गुण है। इसके अलावा, मैंने जोड़ा-डिफाइल = डिबग कॉन्फ़िगरेशन के रूप में स्थानीय लेकिन यह मान नहीं उठाया जा रहा है
user3534483

क्योंकि आपको spring.active.profilesऐसा उपयोग सेट करने की आवश्यकता है -Dspring.active.profiles=local। बजाय।
एम। डिनम

नो सक्सेस सर। इसलिए -Dprofile के बजाय, अब मैं -Dspring.active.profiles = स्थानीय का उपयोग कर रहा हूं। और फिर मेरी कॉन्फ़िगरेशन फ़ाइल में मैं स्ट्रिंग ड्राइवर को लाने की कोशिश करता हूं StringName = env.getProperty ("driverClassName"); env वसंत से पर्यावरण है
user3534483

1
माफ़ करना मेरी बुर, इसे चारों ओर मिलाया :)।
एम। डिनम

जवाबों:


170

स्प्रिंग बूट में पहले से ही प्रोफ़ाइल आधारित गुणों के लिए समर्थन है

बस एक application-[profile].propertiesफ़ाइल जोड़ें और spring.profiles.activeसंपत्ति का उपयोग करने के लिए प्रोफाइल निर्दिष्ट करें ।

-Dspring.profiles.active=local

यह पहले से ओवरराइडिंग गुणों application.propertiesके application-local.propertiesसाथ और लोड करेगा ।


1
क्या हम उन दोनों को लोड किए बिना विशिष्ट प्रोफ़ाइल के लिए किसी अन्य फ़ाइल के साथ अनुप्रयोग गुणों के उपयोग को ओवरराइड कर सकते हैं? उदाहरण के लिए परीक्षण या देव के लिए?
हसाम अब्देलिल्लाह

1
एम। डाइनम, मेरे पास भी ऐसा ही मुद्दा है, मेरे पास application.yml और application-qa.yml है और मैंने दिया -Dspring.profiles.active = qa, दोनों फाइलें पढ़ी जा रही हैं, लेकिन Application-qa.yml के गुण अधिलेखित नहीं हैं। application.yml से गुण, मैं हमेशा application.yml से ही गुण देख रहा हूँ? क्या प्राथमिकता को निर्दिष्ट करने का कोई तरीका है?
सुरेश चौरंगी 15

5
हाय दोनों, यह आपकी समस्याओं को हल कर सकता है। docs.spring.io/spring-boot/docs/current/reference/html/… उदाहरण: mkyong.com/spring-boot/…
आनंद

मैं aamb lambda के लिए कोड लिख रहा हूं और इस कुंजी = मान को पर्यावरण मान के रूप में पास कर सकता हूं - जिसे System.getenv () का उपयोग करके पहुँचा जा सकता है - क्या यह काम करेगा?
अब्देइली चंदनवाला

मेरे पास 4 एप्लिकेशन हैं- {प्रोफाइल} .प्रोफाइल फाइल। और मैं एक ही जार फ़ाइल को अलग-अलग वातावरण में चलाना चाहता हूं, हमें देव, परीक्षण, ठेस कहना है। तो मैं उपयोग नहीं कर सकता -Dspring.profiles.active = स्थानीय। अगर मुझे कुछ याद आ रहा है तो कृपया मुझे सही करें।
आशीष बर्नवाल

24

हाँ तुम कर सकते हो। चूंकि आप वसंत का उपयोग कर रहे हैं, इसलिए देखें@PropertySource एनोटेशन देखें।

के साथ अपने कॉन्फ़िगरेशन को एनोटेट करें

@PropertySource("application-${spring.profiles.active}.properties")

आप इसे कभी भी अपनी पसंद के अनुसार कॉल कर सकते हैं, और यदि आपको बहुत पसंद है अच्छा हो सकता है यदि आपके पास अधिक सेट और / या डिफॉल्ट हैं जो सभी वातावरणों से संबंधित हैं (@PropertySource {..., ..., ...} साथ ही) लिखा जा सकता है।

@PropertySources({
  @PropertySource("application-${spring.profiles.active}.properties"),
  @PropertySource("my-special-${spring.profiles.active}.properties"),
  @PropertySource("overridden.properties")})

फिर आप पर्यावरण के साथ आवेदन शुरू कर सकते हैं

-Dspring.active.profiles=test

इस उदाहरण में, नाम को एप्लिकेशन-परीक्षण-गुणों और इतने पर प्रतिस्थापित किया जाएगा।


2
समस्या यह है कि $spring.profiles.active}एक सरणी / अल्पविराम से अलग स्ट्रिंग है। इसलिए यह वह नहीं हो सकता है जो आप अपेक्षा करते हैं / यह करना चाहते हैं जब कई प्रोफाइल सक्रिय हों।
एम। दीनुम

यह सच है, लेकिन दो प्रोफाइल के लिए ठीक काम करता है - एक डिफ़ॉल्ट और एक प्रॉपर्टीसोर्स से परिभाषित है। अधिक उन्नत संपत्ति से निपटने के लिए, मुझे लगता है कि आपको स्प्रिंग के बाहर देखना होगा। इसके अलावा प्रॉपर्टीसोर्स स्टार्टअप के दौरान ही पढ़ा जाता है। अन्य, संपत्ति से निपटने के लिए अधिक उन्नत पुस्तकालय, गुणों को रन-टाइम में भी बदल सकते हैं।
THz

2
यह काम किया है, लेकिन मुझे अभी भी समझ में नहीं आया कि मुझे ऐसा क्यों करना पड़ा। मेरे किसी अन्य भंडार में मुझे ऐसा करने की जरूरत नहीं थी।
जावा गाय

7

हम इस तरह कर सकते हैं:

में application.yml :

spring:
  profiles:
    active: test //modify here to switch between environments
    include:  application-${spring.profiles.active}.yml

में -test.yml :

server:
  port: 5000

और में आवेदन में local.yml :

server:
  address: 0.0.0.0
  port: 8080

जैसे ही हम चाहते हैं तब स्प्रिंग बूट हमारे ऐप को शुरू कर देगा।


2
क्या आप इस तरह से सक्रिय प्रोफ़ाइल को हार्डकोड नहीं कर रहे हैं ?? :(
अन्ना मेदियुख

0

माई प्वाइंट, इस तरीके से डेवलपर को एकल में संबंधित सभी पर्यावरण बनाने के लिए कह रहा है, जिसके परिणामस्वरूप डेवलपर को समाप्त करने के लिए उत्पादन कॉन्फ़िगरेशन को उजागर करने का जोखिम है

12-फैक्टर के अनुसार, एन्वॉर्नमेंट में केवल विशिष्ट निवास स्थान होना चाहिए।

हम सीआई सीडी के लिए कैसे करते हैं

  • एक बार स्प्रिंग का निर्माण करें और अभिषेक के माहौल को बढ़ावा दें, उस स्थिति में, यदि हमारे पास स्प्रिंग जार में सभी वातावरण हैं, तो यह सुरक्षा जोखिम होगा, जीआईटी में सभी पर्यावरण चर रहे हैं
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.