स्प्रिंग 3.1 में डिफ़ॉल्ट प्रोफ़ाइल


100

मेरे आवेदन में मैं सेम के साथ व्याख्या की है @Profile("prod")और @Profile("demo")। पहला, जैसा कि आप अनुमान लगा सकते हैं :), सेम पर उपयोग किया जाता है जो उत्पादन डीबी से जुड़ता है और दूसरा एक एनोटेट करता है जो कुछ नकली DB ( HashMapया जो भी) का उपयोग करते हैं - तेजी से विकास करने के लिए।

मैं जो कुछ भी करना चाहता हूं वह डिफ़ॉल्ट प्रोफ़ाइल ( "prod") है जो हमेशा उपयोग किया जाएगा यदि यह " कुछ-और " द्वारा ओवरराइड नहीं किया जाता है ।

सही मेरे में होगा web.xml:

<context-param>
     <param-name>spring.profiles.active</param-name>
     <param-value>prod</param-value>
</context-param>

और फिर इसे ओवरराइड करें -Dspring.profiles.active="demo"ताकि मैं कर सकूं:

mvn jetty:run -Dspring.profiles.active="demo". 

लेकिन दुख की बात है कि यह काम नहीं कर रहा है। किसी भी विचार मैं कैसे हासिल कर सकता है? -Dspring.profiles.active="prod"मेरे सभी वातावरण पर सेट करना एक विकल्प नहीं है।

जवाबों:


67

मेरा अनुभव है कि उपयोग कर रहा है

@Profile("default")

यदि किसी अन्य प्रोफ़ाइल की पहचान नहीं की जाती है तो बीन को केवल संदर्भ में जोड़ा जाएगा। यदि आप किसी अन्य प्रोफ़ाइल में पास करते हैं, उदाहरण के लिए -Dspring.profiles.active="demo", इस प्रोफ़ाइल को अनदेखा कर दिया गया है।


4
स्वीकृत उत्तर web.xml (और यह ठीक है) पर निर्भर करता है, लेकिन यह उत्तर कार्य करता है कि क्या आपके पास web.xml है या नहीं और इसलिए यह सभी के लिए अधिक उपयोगी है।
Jay

1
यह समाधान ज्यादा साफ है
cahen

क्या यह एक आधिकारिक विशेषता है या कुछ दुष्प्रभाव हैं? क्या आप उस स्प्रिंग डॉक्यूमेंट से लिंक करना चाहते हैं जहाँ यह सुविधा वर्णित है?
rustyx

111

अपने web.xml में डिफ़ॉल्ट प्रोफ़ाइल के रूप में अपने उत्पादन वातावरण को परिभाषित करें

<context-param>
   <param-name>spring.profiles.default</param-name>
   <param-value>prod</param-value>
</context-param>

और यदि आप एक अलग प्रोफ़ाइल का उपयोग करना चाहते हैं, तो इसे सिस्टम प्रॉपर्टी के रूप में पास करें

mvn -Dspring.profiles.active="demo" jetty:run

3
नहीं उन्होंने web.xml में और सिस्टम प्रॉपर्टी में सक्रिय प्रोफ़ाइल को परिभाषित करने की कोशिश की । मेरे समाधान में मैं web.xml में एक डिफ़ॉल्ट प्रोफ़ाइल कॉन्फ़िगर करता हूं और सिस्टम संपत्ति के माध्यम से सक्रिय प्रोफ़ाइल को अधिलेखित / परिभाषित करता हूं । यदि कोई स्पष्ट सक्रिय प्रोफ़ाइल नहीं है, तो डिफ़ॉल्ट का उपयोग किया जाएगा।
-इह

1
धन्यवाद! जैसा मुझे चाहिए था यह बिल्कुल वैसा ही है! यह कहीं भी नहीं मिल सकता है: /
मिशेल मार्गियल

इस दृष्टिकोण के साथ एक समस्या: यदि आप सेट spring.profiles.default=prodकरते हैं application.properties, तो application-prod.propertiesलोड नहीं किया जाएगा। यह जवाबी कार्रवाई है।
गमलीला

@gamliela दृष्टिकोण किसी application.propertiesफ़ाइल में डिफ़ॉल्ट प्रोफ़ाइल सेट नहीं करता है । यह जानने के लिए कि application-prod.propertiesआपको उपयोग करना चाहिए, आपको प्रोफ़ाइल को जानना होगा। यही इस दृष्टिकोण को करता है। यह या तो web.xmlडिफ़ॉल्ट (डिफ़ॉल्ट) या पर्यावरण चर के माध्यम से प्रोफाइल को परिभाषित करता है (डिफ़ॉल्ट को अधिलेखित)।
औरह

@andih हाँ, मैं जानता हूँ कि, लेकिन मैं केवल यह कहता हूँ कि यह सहज और समस्याग्रस्त नहीं है। चूंकि application-default.propertiesमैं लोड हो गया हूं, इसलिए मैं यह भी उम्मीद करता हूं कि application-newdefault.propertiesइसे भी लोड किया जाएगा। यह आपके समाधान के साथ कोई समस्या नहीं है, यह स्प्रिंग के साथ एक समस्या है ...
gamliela

6

मेरे पास एक ही मुद्दा है, लेकिन मैं ServletContext प्रोग्रामेटिक रूप से (Servlet 3.0+) कॉन्फ़िगर करने के लिए WebApplicationInitializer का उपयोग करता हूं । तो मैं निम्नलिखित कार्य करता हूं:

public class WebAppInitializer implements WebApplicationInitializer {

    @Override
    public void onStartup(ServletContext sc) throws ServletException {
        // Create the 'root' Spring application context
        final AnnotationConfigWebApplicationContext rootContext = new AnnotationConfigWebApplicationContext();
        // Default active profiles can be overridden by the environment variable 'SPRING_PROFILES_ACTIVE'
        rootContext.getEnvironment().setDefaultProfiles("prod");
        rootContext.register(AppConfig.class);

        // Manage the lifecycle of the root application context
        sc.addListener(new ContextLoaderListener(rootContext));
    }
}

5

आप PROD प्रोफ़ाइल को हटाने पर भी विचार कर सकते हैं, और @Profile ("डेमो") का उपयोग कर सकते हैं


2
मुझे लगता है कि अगर आपके पास दो से अधिक प्रोफाइल हैं तो यह काम नहीं करेगा?
चोप-

3

डिफ़ॉल्ट उत्पादन प्रोफ़ाइल सेट करने के बारे में पहले से ही @andih पोस्ट किया गया है

मावेन जेट्टी प्लगइन के लिए डिफ़ॉल्ट प्रोफ़ाइल सेट करने का सबसे आसान तरीका है, अपने प्लगइन कॉन्फ़िगरेशन में नीचे तत्व को शामिल करना है:

<plugin>
    <groupId>org.eclipse.jetty</groupId>
    <artifactId>jetty-maven-plugin</artifactId>
    <configuration>
        <systemProperties>
            <systemProperty>
                <name>spring.profiles.active</name>
                <value>demo</value>
            </systemProperty>
        </systemProperties>
    </configuration>
</plugin>

3

कौन सी प्रोफ़ाइल सक्रिय है, यह निर्धारित करते समय वसंत दो अलग-अलग गुण प्रदान करता है:

  • spring.profiles.active

तथा

  • spring.profiles.default

यदि spring.profiles.activeसेट किया जाता है, तो इसका मूल्य निर्धारित करता है कि कौन से प्रोफाइल सक्रिय हैं। लेकिन अगर spring.profiles.activeसेट नहीं किया जाता है, तो स्प्रिंग दिखता हैspring.profiles.default.

तो न तो spring.profiles.activeहै और न ही spring.profiles.defaultसेट किया गया है, तो कोई सक्रिय प्रोफाइल, और केवल उन सेम है कि एक प्रोफाइल में होने के रूप में परिभाषित नहीं कर रहे हैं created.Any सेम एक प्रोफ़ाइल के अंतर्गत आता है निर्दिष्ट नहीं है कि कर रहे हैं defaultप्रोफ़ाइल।


-1

आप फ़िल्टर किए गए संसाधन के रूप में अपने web.xml को सेटअप कर सकते हैं और यह मान maven प्रोफ़ाइल सेटिंग्स से भरा है - कि हम क्या करते हैं।

पोम फ़िल्टर में सभी संसाधन (यदि आपके पास $ {} अंकन नहीं है तो आप टैट कर सकते हैं)

<webResources>
    <resource>
        <directory>src/main/webapp</directory>
        <filtering>true</filtering>
    </resource>
</webResources>

web.xml put में

<context-param>
     <param-name>spring.profiles.active</param-name>
     <param-value>${spring.prfile}</param-value>
</context-param>

पोम में मावेन प्रोफाइल बनाएं

<profiles>
    <profile>
        <id>DEFAULT</id>
        <activation>
            <activeByDefault>true</activeByDefault>
        </activation>
        <properties>
            <spring.profile>prod</spring.profile>
        </properties>
    <profile>
    <profile>
        <id>DEMO</id>
        <properties>
            <spring.profile>demo</spring.profile>
        </properties>
    <profile>
</profiles>

अब आप उपयोग कर सकते हैं

mvn jetty:run -P DEMO

या बस -P DEMOकिसी मावेन कमांड के साथ


1
मुझे यकीन नहीं है, लेकिन मुझे लगता है कि यह काम नहीं करेगा। IMHO जेटी: रन चरण नहीं चलेगा जिसमें संसाधन फ़िल्टर किए जाते हैं।
मिशैल मार्गील

कौर के लिए आपको एमवायएन क्लीन कम्पाइल जेट्टी चलाने की आवश्यकता है: पी-डेमो को चलाएं, लेकिन अनकैप्ड कोड के साथ यह इसे ऑटिमैटिक तरीके से चलाता है
हर्डा

10
मैं समझता हूं कि स्प्रिंग 3.1 प्रोफाइल का एक मुख्य लक्ष्य सभी वातावरणों में तैनात होने के लिए एक एकल WAR फ़ाइल तैयार करना है। मावेन प्रोफाइल का उपयोग करना पिछली अवस्था में एक कदम है: जहां प्रत्येक वातावरण के लिए एक WAR फ़ाइल की पैकेजिंग की आवश्यकता थी ...
edrabc

@edrabc वह mvn जेटी के लिए पूछ रहा था: भागो - कोई WAR फ़ाइल नहीं है।
हुरडा

सहमत @ हुरडा। लेकिन वह कई वातावरण में कमान चलाने के लिए भी कह रहा था: मावेन प्रोफाइल और स्प्रिंग प्रोफाइल का मिश्रण थोड़ा भ्रामक हो सकता है ...
edrabc
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.