2009-07-09 13 views
18

मैंने this question देखा और यह मुझे कॉन्फ़िगरेशन घोषित करने के वैकल्पिक तरीके के लिए मेवेन कॉन्फ़िगरेशन में फिर से (सफलता के बिना) देखने के लिए प्रेरित करता है, इसलिए यह इसे ओवरराइड करने के बजाय मूल POM की कॉन्फ़िगरेशन में जोड़ा जाता है। एक मेवेन पीओएम में, यदि कॉन्फ़िगरेशन माता-पिता के समान तत्व घोषित करता है तो यह माता-पिता कॉन्फ़िगरेशन को ओवरराइड करता है। जैसा कि दूसरे प्रश्न के स्वीकृत उत्तर में कहा गया है, यह अपेक्षित व्यवहार है।मेवेन कॉन्फ़िगरेशन ओवरराइड करने के बजाए बढ़ाना

लेकिन यह हमेशा वांछित व्यवहार नहीं है। क्या कॉन्फ़िगरेशन ओवरराइड करने के बजाय मेवेन में जोड़ने का कोई अर्थ होना चाहिए?

उदाहरण के लिए: - कॉन्फ़िगरेशन फ़ाइनल के तत्व घोषित करने की क्षमता प्रदान करें, ताकि बच्चे उन्हें जोड़ सकें लेकिन प्रतिस्थापित नहीं कर सकें? - बच्चे विन्यास, एक अतिरिक्त के रूप तत्व घोषित करने के लिए तो यह माता पिता


जब ओवरराइड व्यवहार हमेशा वांछनीय नहीं है का एक अच्छा उदाहरण AspectJ-Maven-प्लगइन का aspectLibraries तत्व के लिए है के साथ विलय कर दिया है की अनुमति दें ।

मेरे मूल पीओएम में मैं पहलू प्लगइन के लिए एक कॉन्फ़िगरेशन परिभाषित करता हूं जो एक ट्रेसिंग जार को एक पहलू पुस्तकालय के रूप में उपयोग करने की घोषणा करता है।

<plugin> 
    <groupId>org.codehaus.mojo</groupId> 
    <artifactId>aspectj-maven-plugin</artifactId> 
    <executions> 
    <execution> 
    <id>compile_with_aspectj</id> 
     <goals> 
     <goal>compile</goal> 
     </goals> 
    </execution> 
    </executions> 
    <configuration> 
    <aspectLibraries> 
     <aspectLibrary> 
     <groupId>name.seller.rich</groupId> 
     <artifactId>tracing</artifactId> 
     </aspectLibrary> 
    </aspectLibraries> 
    </configuration> 
    <dependencies> 
    <dependency> 
     <groupId>aspectj</groupId> 
     <artifactId>aspectjtools</artifactId> 
     <version>1.5.3</version> 
    </dependency> 
    </dependencies> 
</plugin> 

यह सभी बाल परियोजनाओं द्वारा विरासत में मिला है और मुझे सभी परियोजनाओं में पता लग रहा है, जो अच्छा है। हालांकि अगर मैं एक बच्चे पीओएम में एक और पहलू पुस्तकालय परिभाषित करता हूं, तो यह मेरी ट्रेसिंग कॉन्फ़िगरेशन को प्रतिस्थापित करता है।

नोट मेरे पास इस विशेष समस्या का समाधान है, मुझे सामान्य मामले और मेवेन के लिए प्रभाव में रूचि है।

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

उपरोक्त नमूने में निर्भरता घोषणा माता-पिता और अन्य जगहों पर अन्य निर्भरता घोषणाओं के साथ विलय कर दी गई है। मुझे पता है निर्भरता एक विशेष मामला है, लेकिन यह दिखाता है कि इसे कार्यान्वित करने के लिए संभव है।

उत्तर

21

यह सोनाटाइप द्वारा blog post में समझाया गया था।

माता पिता पोम में, निर्दिष्ट

<configuration> 
    <aspectLibraries combine.children="append"> 
    <aspectLibrary> 
     <groupId>name.seller.rich</groupId> 
     <artifactId>tracing</artifactId> 
    </aspectLibrary> 
    </aspectLibraries> 
</configuration> 

सामान्य तौर पर, बच्चों के विन्यास तत्व किसी भी प्लगइन के लिए माता-पिता में निर्दिष्ट की गई पर आ जाएगी। यह डिफ़ॉल्ट रूप से चीजों को सरल रखता है: एक पूरी तरह से कॉन्फ़िगर किया गया बच्चा अपने पोम में बिल्कुल कॉन्फ़िगरेशन का उपयोग करेगा। हालांकि, माता-पिता लागू कर सकते हैं कि वांछित कॉन्फ़िगरेशन तत्वों पर combine.children = "append" सेटिंग का उपयोग करके प्रतिस्थापित की जानी चाहिए।

+2

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

+1

को सुझाए गए अनुसार अपडेट नहीं किया गया है। यदि भविष्य में मैवेन संस्करणों में यह व्यवहार बदलता है, तो उम्मीद है कि जो लोग जानते हैं वे मेवेन उपयोगकर्ता अकसर किये गए सवाल को अपडेट करेंगे। –

1

मुझे इसका परीक्षण करने की ज़रूरत है इसलिए मुझे इस पर वापस आने दें, लेकिन मुझे लगता है कि ऐसा करने का सही तरीका properties का उपयोग करना है, जैसा कि here नोट किया गया है। आपके मामले में कोड के रूप में विचार करेंगे इस प्रकार है:

<properties> 
    <aspect.library.groupId>name.seller.rich</aspect.library.groupId> 
    <aspect.library.artifactId>tracing</aspect.library.artifactId> 
</properties> 

<plugin> 
    <groupId>org.codehaus.mojo</groupId> 
    <artifactId>aspectj-maven-plugin</artifactId> 
    <executions> 
    <execution> 
    <id>compile_with_aspectj</id> 
     <goals> 
     <goal>compile</goal> 
     </goals> 
    </execution> 
    </executions> 
    <configuration> 
    <aspectLibraries> 
     <aspectLibrary> 
     <groupId>${aspect.library.groupId}</groupId> 
     <artifactId>${aspect.library.artifactId}</artifactId> 
     </aspectLibrary> 
    </aspectLibraries> 
    </configuration> 
    <dependencies> 
    <dependency> 
     <groupId>aspectj</groupId> 
     <artifactId>aspectjtools</artifactId> 
     <version>1.5.3</version> 
    </dependency> 
    </dependencies> 
</plugin> 

तो बच्चे में आप उन गुणों को बदलने में सक्षम हो सकता है, और माता पिता के लिए स्वचालित रूप से नए मूल्यों को लेने जाएगा:

<properties> 
    <aspect.library.groupId>name.seller.rich</aspect.library.groupId> 
    <aspect.library.artifactId>something-else</aspect.library.artifactId> 
</properties> 

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

संबंधित मुद्दे