2011-08-28 18 views
17

मैं एक Maven मूलरूप आदर्श जो एक परियोजना कंकाल कि परियोजना जहाँ से मूलरूप आदर्श जन्म लिया है पर निर्भरता शामिल होंगे उत्पन्न बना रहा हूं।मेवेन आर्केटाइप में आर्चेटाइप प्रोजेक्ट संस्करण को कैसे एम्बेड करें?

उदाहरण के लिए, मूल परियोजना लगता है:

origin/archetype/... archetype for generating project 
     /core/... core services 
     /extra/... extra services 

और मूलरूप आदर्श एक पोम कि निर्भरता इतनी तरह होता है के साथ एक परियोजना तैयार करेगा:

<dependencies> 
    <dependency> 
    <groupId>com.foo</groupId> 
    <artifactId>origin-core</artifactId> 
    <version>SOMEVERSION</code> 
    </dependency> 
</dependencies> 

मैं SOMEVERSION होना चाहता हूँ पर मूल प्रोजेक्ट का संस्करण जो आर्केटाइप को भंडार में बनाया और स्थापित किया गया है।

तो अगर मूल परियोजना संस्करण 1.0-SNAPSHOT पर है और mvn install एड है, तो मैं मूलरूप आदर्श origin-core 1.0-SNAPSHOT पर निर्भरता उत्पन्न करना चाहते हैं। और जब मूल परियोजना जारी की है, और स्वचालित रूप से संस्करण 1.0 के लिए टकरा, मैं मूलरूप आदर्श origin-core 1.0 पर निर्भरता उत्पन्न करना चाहते हैं।

असल में मैं ${archetypeVersion} का उपयोग आर्केटाइप पीओएम में वेग चर के रूप में करना चाहता हूं, लेकिन यह संभव नहीं लगता है।

वहाँ क्या मैं यहाँ क्या करने की कोशिश कर रहा हूँ को पूरा करने के किसी भी अन्य रास्ता नहीं है?

उत्तर

32

मैं Maven मेलिंग सूची पर ऊपर प्रश्न पूछा कुछ दिन पहले और tumbleweeds मिला है। सौभाग्य से, मैं अंततः इसे अपने आप पर लगा। इसे पूरा करने के लिए कम से कम एक सौदा तरीका यहां दिया गया है:

आर्केटाइप बनाने के दौरान वर्तमान प्रोजेक्ट संस्करण में प्रतिस्थापित करने के लिए src/main/resources/archetype-resources/pom.xml फ़ाइल पर मैवेन फ़िल्टरिंग का उपयोग करें।

यहाँ है कि कैसे किया जाता है:

archetype-resources/pom.xml फ़ाइल पर और कुछ और पर नहीं छानने सक्षम करने के लिए अपने archetype/pom.xml फ़ाइल को संशोधित (क्योंकि आपके मूलरूप आदर्श फ़ाइलों स्वाभाविक रूप से ${variable} होगा हर जगह है और आप उन नहीं करना चाहते निर्माण समय पर प्रतिस्थापित करने के लिए, आप चाहते हैं कि आर्केटाइप बनने पर उन्हें प्रतिस्थापित किया जाए)।

<pluginManagement> 
    <plugins> 
    ... 
    <plugin> 
     <groupId>org.apache.maven.plugins</groupId> 
     <artifactId>maven-resources-plugin</artifactId> 
     <version>2.5</version> 
     <configuration> 
     <escapeString>\</escapeString> 
     </configuration> 
    </plugin> 
    </plugins> 
</pluginManagement> 
:

<resources> 
    <resource> 
    <directory>src/main/resources</directory> 
    <filtering>true</filtering> 
    <includes> 
     <include>archetype-resources/pom.xml</include> 
    </includes> 
    </resource> 
    <resource> 
    <directory>src/main/resources</directory> 
    <filtering>false</filtering> 
    <excludes> 
     <exclude>archetype-resources/pom.xml</exclude> 
    </excludes> 
    </resource> 
</resources> 

ताकि आप अपने मूलरूप आदर्श पोम में सभी चर के रूप में-है ताकि वे मूलरूप आदर्श पीढ़ी समय में प्रतिस्थापित किया जा सकता रहने के लिए जरूरत है कि बच सकते हैं, जब छानने उपयोग के लिए एक भागने चरित्र सक्षम करें

(ऊपर दिखाए गए <resources> और <pluginManagement> तत्वों को नोट करें अपने पीओएम के <build> तत्व के अंदर रखा जाना चाहिए।)

अपने मूलरूप आदर्श पोम, जहाँ आप चाहते हैं कि आपके मूलरूप आदर्श परियोजना के संस्करण सम्मिलित करने के लिए, और अन्य चर के सभी कि मूलरूप आदर्श पीढ़ी समय तक अनसब्सटीट्युटेड रहना चाहिए भागने में उपयोग ${project.version}: एक वैकल्पिक

<?xml version="1.0" encoding="UTF-8"?> 
<project ...> 
    <modelVersion>4.0.0</modelVersion> 

    <groupId>\${groupId}</groupId> 
    <artifactId>\${artifactId}</artifactId> 
    <version>\${version}</version> 
    <packaging>jar</packaging> 

    <dependencies> 
    <dependency> 
     <groupId>com.foo</groupId> 
     <artifactId>origin-core</artifactId> 
     <version>${project.version}</version> 
    </dependency> 
    </dependencies> 

</project> 
+0

बिल्कुल वही जो मुझे अभी चाहिए था। बहुत बहुत धन्यवाद। –

+0

एक आकर्षण की तरह काम करता है! धन्यवाद। – Malvin

+0

यह बहुत प्यारा, उत्कृष्ट पोस्ट है। – ocarlsen

12

स्वीकार किए जाते हैं जवाब का हल archetype's descriptor/metadata फ़ाइल में एक सामान्य प्रॉपर्टी फिल्टर करने के लिए

यह बहुत की तरह किया जाता है:

Maven केवल छानने इस फाइल फिल्टर:

<resources> 
<resource> 
    <directory>src/main/resources</directory> 
    <filtering>true</filtering> 
    <includes> 
     <include>META-INF/maven/archetype-metadata.xml</include> 
    </includes> 
</resource> 
<resource> 
    <directory>src/main/resources</directory> 
    <filtering>false</filtering> 
    <excludes> 
     <exclude>META-INF/maven/archetype-metadata.xml</exclude> 
    </excludes> 
</resource> 
</resources> 

मूलरूप आदर्श मेटा डेटा फ़ाइल:

<?xml version="1.0" encoding="UTF-8"?> 
<project ...> 
    <modelVersion>4.0.0</modelVersion> 

    <groupId>${groupId}</groupId> 
    <artifactId>${artifactId}</artifactId> 
    <version>${version}</version> 
    <packaging>jar</packaging> 

    <dependencies> 
    <dependency> 
     <groupId>com.foo</groupId> 
     <artifactId>origin-core</artifactId> 
     <version>${projectVersion}</version> 
    </dependency> 
    </dependencies> 

</project> 
:

<archetype-descriptor ...> 
    <requiredProperties> 
     <requiredProperty key="projectVersion"> 
      <defaultValue>${project.version}</defaultValue> 
     </requiredProperty> 
    </requiredProperties> 

    ... 
</archetype-descriptor> 

और मूलरूप आदर्श के पोम सिवाय इसके कि यह परियोजना संस्करण के रूप में projectVersion आवश्यक संपत्ति के मूल्य का प्रयोग करेंगे से पहले करने के समान होगा

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

यह मतलब है जिस पर उपयोगकर्ताओं मूलरूप आदर्श पैदा करने की पुष्टि करने या परियोजना संस्करण को बदलने के लिए कहा जाता है। परिदृश्य के आधार पर, मुझे लगता है कि इसे एक अच्छी या बुरी चीज माना जा सकता है।

+0

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

-1

मैंने कुछ बेवकूफ कोशिश की और ऐसा लगता है कि ऐसा लगता है। मैं अपने META-INF/Maven/मूलरूप आदर्श-metadata.xml फ़ाइल में निम्नलिखित कहा:

<requiredProperties> 
    <requiredProperty key="archetypeVersion"> </requiredProperty> 
</requiredProperties> 

आप इसे इसके बारे में डिफ़ॉल्ट रूप से पता होगा लगता होगा लेकिन ऐसा नहीं तो यह इसका इस्तेमाल करने के लिए यह याद दिलाने के लिए लगता है करता है । शायद यह मेवेन में एक बग के कारण है।

+0

का एक बहुत बचाता है। वैकल्पिक रूप से आप नौकरी करने के लिए @ फिलमडर जवाब पर भरोसा कर सकते हैं। – LoganMzz

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