मावेन प्रोफाइल को कैसे सक्रिय रखें जो एक और प्रोफाइल सक्रिय हो जाने पर भी सक्रिय है।


113

मेरे पास मेरे pom.xml में एक प्रोफ़ाइल है जो हमेशा सक्रिय होनी चाहिए जब तक कि यह विस्फोटक रूप से निष्क्रिय न हो जाए (-पहला! फर्स्टप्रोफाइल)। मैंने इसे सक्रिय बायफॉल्ट फ़्लैग का उपयोग करके हल किया:

<profiles>
  <profile>
    <id>firstProfile</id>
    <activation>
      <activeByDefault>true</activeByDefault>
    </activation>
    ...
  </profile>
</profiles>

अब उसी pom.xml में मैंने एक दूसरा प्रोफ़ाइल परिभाषित किया है यह केवल तभी सक्रिय होना चाहिए जब प्रोफ़ाइल वास्तव में सक्रिय हो (-पब्लिकप्रोफाइल)। तो डिफ़ॉल्ट व्यवहार है: FirstProfile सक्रिय, SecondProfile निष्क्रिय। कुछ अन्य बिंदु पर मैं पहली प्रोफ़ाइल के अलावा दूसरी प्रोफ़ाइल को सक्रिय करना चाहूंगा। अब समस्या यह है कि अगर मैं ऐसा करता हूं तो "-P सेकंडप्रोफाइल" के साथ फर्स्टप्रोफाइल दुर्भाग्य से निष्क्रिय हो जाता है। मावेन प्रलेखन यह बताता है:

... यह प्रोफ़ाइल स्वचालित रूप से सभी बिल्ड के लिए सक्रिय हो जाएगी जब तक कि एक ही POM में कोई अन्य प्रोफ़ाइल पहले वर्णित विधियों में से एक का उपयोग करके सक्रिय न हो। डिफ़ॉल्ट रूप से सक्रिय होने वाले सभी प्रोफ़ाइल स्वचालित रूप से निष्क्रिय हो जाते हैं जब पीओएम में एक प्रोफ़ाइल कमांड लाइन पर या उसके सक्रियण कॉन्फ़िगरेशन के माध्यम से सक्रिय होती है। ...

क्या किसी तरह एक संभावना है कि फ़र्स्टप्रोफ़ाइल को हमेशा सक्रिय कैसे रखा जाए (इसे सेटिंग में घोषित किए बिना। xml)?


जवाबों:


153

एक चाल से बचने के लिए है activeByDefault, और इसके बजाय एक संपत्ति की अनुपस्थिति से प्रोफ़ाइल को सक्रिय करें, जैसे:

<profiles>
  <profile>
    <id>firstProfile</id>
    <activation>
      <property>
        <name>!skipFirstProfile</name>
      </property>
    </activation>
    ...
  </profile>
</profiles>

आपको तब प्रोफ़ाइल को -DskipFirstProfile उसके साथ या साथ निष्क्रिय करने में सक्षम होना चाहिए -P !firstProfile, लेकिन अन्यथा प्रोफ़ाइल सक्रिय होगी।

देखें: मावेन: सम्पूर्ण संदर्भ, प्रोफाइल सक्रियण - एक संपत्ति की अनुपस्थिति द्वारा सक्रियण


यह किन परिस्थितियों में प्रोफ़ाइल का स्पष्ट रूप से उल्लेख करने की तुलना में सहायक या बेहतर है? पास करने के बजाय -DmyFlag से गुजरने के बजाय मैं -myDefaultProfile को सही कर सकता हूं? क्या किसी ध्वज के साथ इसे नियंत्रित करने का कोई लाभ है जो मुझे याद आ रहा है?
१५:०२ पर चीता

1
क्योंकि ध्वज नहीं होने पर प्रोफ़ाइल स्वचालित रूप से सक्रिय है । firstProfileयदि आप निर्दिष्ट करते हैं -DskipFirstProfile(जैसे mvn verify -DskipFirstProfile), तो प्रोफ़ाइल अक्षम है ।
सीन

25

काश ऐसी कोई संभावना होती, मैं अक्सर इसे याद करता। एकमात्र प्रासंगिक JIRA मुद्दा मुझे मिल सकता है यह एक है:

MNG-4917: प्रोफाइल सक्रिय नहीं है, भले ही इसके पास एक्टिवबायफॉल्ट सेट है जो सही है

और इसे हल कर दिया गया है Not A Problem

मैंने उपयोग करना बंद कर दिया है activeByDefault, क्योंकि इस "सभी या कुछ भी नहीं" दृष्टिकोण ने इसे मेरे लिए बेकार बना दिया।


इस व्यवहार को बदलने का एकमात्र तरीका यह है कि आप अपने स्वयं के प्रतिस्थापन को लिखें DefaultProfileSelector, इसे एक plexus घटक के रूप में पंजीकृत करें @Component( role = ProfileSelector.class )और इसे इसमें डाल दें ${MAVEN_HOME}/lib/ext(इस तरह इसे डिफ़ॉल्ट प्रोफ़ाइल चयनकर्ता के रूप में चुना जाएगा)। (यदि आप मावेन 3.0.2 या इससे पुराने का उपयोग कर रहे हैं तो आपको इसे लोड ${MAVEN_HOME}/bin/m2.confकरने lib/extसे पहले लोड करने के लिए संपादित करना होगा lib)


एक वैकल्पिक अच्छा-से-प्रोफ़ाइल, प्रोफ़ाइल-इनहेरिटेंस या प्रोफ़ाइल-डेकोरेटर्स होगा, जिससे आधार कॉन्फ़िगरेशन को फिर से उपयोग करने की अनुमति मिलती है।
क्राउन

@ क्रोन निश्चित रूप से, हाँ। क्यों नहीं सुझाव है कि एक सुविधा अनुरोध के रूप में?
सीन पैट्रिक फ्लोयड

यह संबंधित की तरह है ... एक बात मुझे यह पसंद है कि डिफ़ॉल्ट रूप से एक सक्रिय करने के लिए सभी मॉड्यूल जोड़ना क्योंकि मुझे लगा कि निष्पादन से एक मॉड्यूल को हटाने का कोई तरीका नहीं था। 3.2.1 में उन्होंने इसे यहाँ दिखाया गया है । यदि कोई व्यक्ति यहां ठोकर खाता है और मेरे लिए समान कारण से मॉड्यूल का उपयोग कर रहा है तो मैं यह टिप्पणी छोड़ रहा हूं।
कप्तान मैन

10

यह प्रश्न प्राचीन है, लेकिन यह प्रतीत होता है कि समस्या हल करने के activeProfileबजाय प्रयोग करने योग्य है activeByDefault। मैं मावेन 3.3.9 पर हूं, लेकिन समाधान पहले के संस्करणों पर काम कर सकता है।

बस अपनी सूची activeProfilesमें अपने settings.xmlजैसे, बाहर :

<settings>
  <profiles>
    [...]
  </profiles>
  <activeProfiles>
    <activeProfile>my-awesome-profile</activeProfile>
  </activeProfiles>
</settings>

में my-awesome-profileमैं इसलिए वे, इतने पर डेटाबेस URL जैसे सेटिंग है और हमेशा लागू होते हैं। यहां, मैं एक दूसरी प्रोफ़ाइल सक्रिय करता हूं resolve-from-central:

$ mvn help:all-profiles -P resolve-from-central 
[INFO] Scanning for projects...
[INFO]
[INFO] ------------------------------------------------------------------------
[INFO] Building Maven Stub Project (No POM) 1
[INFO] ------------------------------------------------------------------------
[INFO]
[INFO] --- maven-help-plugin:2.2:all-profiles (default-cli) @ standalone-pom ---
[INFO] Listing Profiles for Project: org.apache.maven:standalone-pom:pom:1
  Profile Id: resolve-from-central (Active: true , Source: settings.xml)
  Profile Id: my-awesome-profile (Active: true , Source: settings.xml)
  Profile Id: resolve-from-internal (Active: false , Source: settings.xml)

ध्यान दें कि कैसे my-awesome-profileसक्रिय है। वाह!


4

आप कमांड लाइन पर सक्रिय सभी प्रोफाइल को सूचीबद्ध कर सकते हैं जैसे कि:

-प्रोफाइल -1, प्रोफाइल -2

मावेन को स्वचालित रूप से कई प्रोफाइल सक्रियण की अनुमति देने के लिए डिज़ाइन किया गया था, यदि आप फिर भी ओवरराइड करते हैं कि -पी के साथ केवल पैरामीटर में सूचीबद्ध प्रोफाइल सक्रिय होते हैं।


7
यह पूरी तरह सच नहीं है। मैन्युअल रूप से सक्रिय प्रोफ़ाइल -Pकेवल प्रोफ़ाइल को निष्क्रिय <activeByDefault>करता है। द्वारा सक्रिय प्रोफाइल <activeProfiles>में settings.xmlया किसी भी अन्य प्रकार से <activation>सक्रिय रहते हैं जब तक स्पष्ट निष्क्रिय किया गया।
सैम हेंस

4

POM में कुछ ऑर्डर लाने के लिए प्रोफाइल एक अच्छा तरीका है। खासकर यदि आप विभिन्न प्रयोजनों के लिए एक ही प्लगइन के कई निष्पादन का उपयोग करते हैं।

फ़ाइलों का उपयोग करना:

<profile>
    <id>alwaysActive</id>
    <activation>
         <file><exists>.</exists></file>
    </activation>
    ...
</profile>

यह हमेशा सच होगा (जब तक कि कोई मावेन बूट के दौरान निर्देशिका को हटा नहीं देता है :)। मावेन 3.6.0 के साथ परीक्षण किया गया।

यह विभिन्न प्रकार की परियोजनाओं के बीच अंतर करने का एक अच्छा तरीका भी हो सकता है। उदाहरण के लिए, मेरी परियोजना हमेशा module.jsonमौजूद रही है।

प्रोफ़ाइल सक्रियण एक्सटेंशन का उपयोग करना

प्रोफ़ाइल सक्रियण के लिए कुछ मावेन एक्सटेंशन हैं। उनमें से एक कांटा यहाँ है:
https://github.com/OndraZizka/el-profile-activator-extension


1
छोटा सुधार यह प्रतीत होता है<file><exists>.</exists></file>
उल्टा

-1

आप डिफ़ॉल्ट प्रोफ़ाइल को सक्रिय नहीं रख सकते हैं, लेकिन आप उस प्रोफ़ाइल की सामग्री (... आपके उदाहरण में) ले सकते हैं और बस इसे pom के मुख्य भाग में ले जा सकते हैं।

सिर्फ इसलिए कि आप प्रोफाइल का उपयोग कर रहे हैं, इसका मतलब यह नहीं है कि आप जो कुछ भी कर रहे हैं वह प्रोफाइल के भीतर होना चाहिए।


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