क्या पेरेंट पोम में प्रोफाइल के लिए पहले से परिभाषित प्लगइन का विन्यास ओवरराइड करना संभव है?


110

मेरे प्रोजेक्ट की POM पैरेंट फ़ाइल में, मेरे पास ऐसी प्रोफ़ाइल है जो इस प्रोजेक्ट के लिए उपयोगी कुछ कॉन्फ़िगरेशन परिभाषित कर रही है (ताकि मुझे इस पैरेंट POM से छुटकारा न मिले):

<profile>
<id>wls7</id>
...
<build>
  <plugins>
    <!-- use java 1.4 -->
    <plugin>
      <groupId>org.apache.maven.plugins</groupId>
      <artifactId>maven-compiler-plugin</artifactId>
      <configuration>
        <fork>true</fork>
        <source>1.4</source>
        <target>1.4</target>
        <meminitial>128m</meminitial>
        <maxmem>1024m</maxmem>
        <executable>%${jdk14.executable}</executable>
      </configuration>
    </plugin>
  </plugins>
</build>

...
</profile>

लेकिन मेरी परियोजना में मैं परीक्षण कक्षाओं को संकलित करने के लिए jdk4 के बजाय jdk5 का उपयोग करने के लिए maven-compiler-plugin के कॉन्फ़िगरेशन को ओवरराइड करना चाहूंगा।

इसलिए मैंने अपनी परियोजना के POM में इस अनुभाग को किया:

<profiles>
  <profile>
    <id>wls7</id>
        <activation>
            <property>
                <name>jdk</name>
                <value>4</value>
            </property>
        </activation>
    <build>
      <directory>target-1.4</directory>
      <plugins>
        <plugin>
          <groupId>org.apache.maven.plugins</groupId>
          <artifactId>maven-compiler-plugin</artifactId>
          <executions>
            <execution>
              <id>my-testCompile</id>
              <phase>test-compile</phase>
              <goals>
                <goal>testCompile</goal>
              </goals>
              <configuration>
                <fork>true</fork>
                <executable>${jdk15.executable}</executable>
                <compilerVersion>1.5</compilerVersion>
                <source>1.5</source>
                <target>1.5</target>
                <verbose>true</verbose>
              </configuration>
            </execution>
          </executions>
        </plugin>
      </plugins>
    </build>
  </profile>
              ...
</profiles>

और यह काम नहीं कर रहा है ...

मैंने अपने POM के नियमित प्लगइन अनुभागों में कॉन्फ़िगरेशन को ओवरराइड करने की भी कोशिश की (मेरा मतलब है, एक विशिष्ट प्रोफ़ाइल के लिए नहीं बल्कि मेरे पूरे पीओएम के लिए)।

क्या समस्या हो सकती है ?

मेरी कुछ आवश्यकताओं को स्पष्ट करने के लिए:

  • मैं मूल POM और प्रोफ़ाइल (wls7) को इसके अंदर परिभाषित नहीं करना चाहता (क्योंकि मुझे कई और कई गुणों, कॉन्फ़िगरेशन, ... की आवश्यकता है) और यह मेरी कंपनी में प्रक्रिया नहीं है।
  • माता-पिता POM और / या इसके अंदर परिभाषित प्रोफ़ाइल को डुप्लिकेट करने के आधार पर एक समाधान एक अच्छा नहीं है। चूंकि अगर
    माता-पिता POM के जिम्मेदार कुछ बदलते हैं, तो मुझे
    इसकी रिपोर्ट करनी होगी।

यह सिर्फ एक विरासत का मामला है (एक प्रोफ़ाइल का विस्तार करें या ओवरराइड करें, एक ऊपरी-स्तरीय पोम से एक कॉन्फ़िगरेशन) इसलिए मुझे लगता है कि यह मावेन 2 के साथ संभव होना चाहिए।


Wls7 प्रोफ़ाइल को कैसे सक्रिय किया जाता है?
पास्कल थिवेंट

प्रोफाइल wls7 और wls10, दोनों मूल POM में "एक्टिवबायफॉल्ट" हैं। लेकिन ग्राहकों की ज़रूरतों के अनुसार, केवल wls10 या दोनों ही स्क्रिप्ट द्वारा बनाए गए हैं ("-P" पैरामीटर के साथ)
Guillaume Cernier

जवाबों:


145

मूल पोम से ओवरराइडिंग कॉन्फ़िगरेशन combine.self="override"आपके पॉम में तत्व को जोड़कर किया जा सकता है ।

अपना प्लगइन कॉन्फ़िगरेशन बदलने की कोशिश करें:

    <plugin>
      <groupId>org.apache.maven.plugins</groupId>
      <artifactId>maven-compiler-plugin</artifactId>
      <executions>
        <execution>
          <id>my-testCompile</id>
          <phase>test-compile</phase>
          <goals>
            <goal>testCompile</goal>
          </goals>
          <configuration combine.self="override">
            <fork>true</fork>
            <executable>${jdk15.executable}</executable>
            <compilerVersion>1.5</compilerVersion>
            <source>1.5</source>
            <target>1.5</target>
            <verbose>true</verbose>
          </configuration>
        </execution>
      </executions>
    </plugin>

ओवरराइडिंग प्लगइन्स के बारे में अधिक जानकारी के लिए, देखें: http://maven.apache.org/pom.html


ऐसा प्रतीत होता है कि Maven2.2.1 के लिए यदि आप एक प्रोफ़ाइल में ऐसा करते हैं, तो यह मूल प्रोफ़ाइल में परिभाषित प्लगइन्स के साथ विलय नहीं करता है, लेकिन उन्हें ओवरराइड करता है। यदि आप एक ही प्लगइन को सीधे निर्माण अनुभाग में परिभाषित करते हैं तो यह काम करता है। Maven3 के लिए यह उम्मीद के मुताबिक हल हुआ।
ग्रेग डोमजान

यह मेरे लिए सही नहीं रहा। मैं MENen 3.3.9 का उपयोग करके pom.xml में org.jenkins-ci.plugins के संस्करण 1.580.1 के साथ जेनकिंस NodeJS प्लगइन v1.0 का पुनर्निर्माण करना चाहता था। जब तक मैंने मैन्युअल रूप से <स्रोत> को 1.7 / / .m2 / रिपॉजिटरी / ऑर्ग / जेनकिंस-सीआई / जेनकिंस / 1.34 / जेनकींस-1.34.pom में बदल दिया, तब तक कुछ भी काम नहीं किया।
अलेक्जेंडर समोयलोव

6

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

इस समस्या को हल करने के लिए मैंने Comb.self विशेषता में काम किया और ठीक काम किया।

डिफ़ॉल्ट बिल्ड:

<plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-war-plugin</artifactId>
    <version>2.4</version>
    <configuration>
        <packagingExcludes>swagger-ui/client.html</packagingExcludes>
    </configuration>
</plugin>

स्वीकृति परीक्षण प्रोफ़ाइल:

<plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-war-plugin</artifactId>
    <version>2.4</version>
    <configuration combine.self="override"/>
</plugin>

1

क्या आपने wls7 प्रोफ़ाइल को निष्क्रिय करने की कोशिश की (maven 2.0.10 के बाद से):

मावेन 2.0.10 के साथ शुरू, एक या एक से अधिक प्रोफाइल को कमांड लाइन का उपयोग करके उनके पहचानकर्ता को चरित्र के साथ प्रीफ़िक्स करके निष्क्रिय किया जा सकता है! ' या '-' जैसा कि नीचे दिखाया गया है:

mvn groupId:artifactId:goal -P !profile-1,!profile-2

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

और फिर एक अलग नाम के साथ या सीधे आपके प्रोफ़ाइल में अपना कॉन्फ़िगरेशन जोड़ें pom.xml


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

मेरे उत्तर को फिर से पढ़ें, यही मैंने सुझाया नहीं है। मैंने एक प्रोफ़ाइल को निष्क्रिय करने का सुझाव दिया, माता-पिता पोम से छुटकारा पाने के लिए नहीं। फिर, आपको पेरेंट पोम में बदलावों की रिपोर्ट क्यों करनी होगी? कुछ भी करने के लिए मजबूर नहीं करता है।
पास्कल थिवेंट

हाँ पास्कल, आपकी मदद के लिए धन्यवाद, लेकिन समस्या यह है कि अगर मैं wls7 प्रोफ़ाइल को निष्क्रिय करता हूं तो मुझे बहुत सारे कॉन्फ़िगरेशन से छुटकारा मिलता है (अन्य प्लगइन्स के लिए, सामान्य सामान, ...) मुझे अभी भी ज़रूरत है। और परिवर्तनों की रिपोर्टिंग करके, मेरा मतलब था कि मेरे POM से माता-पिता POM। क्योंकि, आपके द्वारा सुझाए गए समाधान के साथ, मुझे सभी मूल POM (परीक्षा कक्षाओं के संकलन के लिए अनुभाग को छोड़कर) की नकल करने की आवश्यकता होगी और यदि माता-पिता POM ने अपने POM में कुछ परिवर्तन किया है, तो मुझे किसी भी परिवर्तन से सावधान रहने की आवश्यकता है वर्तमान प्रक्रिया नहीं है और बहुत व्यावहारिक नहीं है।
गिलियूम सर्नियर

ओह, ठीक है, मैं इसे अभी प्राप्त करता हूं। हालांकि, मुझे यकीन नहीं है (लेकिन मैं गलत हो सकता हूं) आप आंशिक रूप से एक पोम को ओवरराइड कर सकते हैं ताकि मेरे पास उपलब्ध विवरण के साथ कोई बेहतर समाधान न हो।
पास्कल थिवेंट

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