2009-09-15 15 views
26

मुझे मेवेन के साथ जार फ़ाइलों को बनाने की आवश्यकता है, लेकिन उन्हें "foobar" एक्सटेंशन के साथ भंडार में स्थापित करने की आवश्यकता है, और यह अच्छा होगा अगर उनके पास अपना स्वयं का पैकेजिंग प्रकार हो ताकि हम उन कलाकृतियों की पहचान कर सकें पैकेजिंग।मैवेन के लिए मैं एक नया पैकेजिंग प्रकार कैसे बना सकता हूं?

क्या मैं ऐसा करने के लिए एक नया पैकेजिंग प्रकार स्थापित कर सकता हूं?

उत्तर

39

जैसा कि आपने वर्णन किया है, पैकेजिंग जार (जैसा कि here कहा गया है) के रूप में एक मेवेन प्रोजेक्ट बनाएं, क्योंकि मोोजो परिभाषाएं नहीं होंगी)। Src/main/resource/META-INF/plexus उप-फ़ोल्डर में निम्न सामग्री के साथ एक घटक.xml बनाएं (मान लें कि आप पैकेजिंग प्रकार "मेरा-कस्टम-प्रकार" होना चाहते हैं, इसे "foobar" में बदलें तमन्ना)।

<component-set> 
    <components> 
    <component> 
     <role>org.apache.maven.lifecycle.mapping.LifecycleMapping</role> 
     <role-hint>my-custom-type</role-hint> 
     <implementation> 
     org.apache.maven.lifecycle.mapping.DefaultLifecycleMapping 
     </implementation> 
     <configuration> 
    <phases> 
     <!--use the basic jar lifecycle bindings, add additional 
      executions in here if you want anything extra to be run-->   
     <process-resources> 
     org.apache.maven.plugins:maven-resources-plugin:resources 
     </process-resources> 
     <package> 
     org.apache.maven.plugins:maven-jar-plugin:jar 
     </package> 
     <install> 
     org.apache.maven.plugins:maven-install-plugin:install 
     </install> 
     <deploy> 
     org.apache.maven.plugins:maven-deploy-plugin:deploy 
     </deploy> 
    </phases> 
     </configuration> 
    </component> 
    <component> 
     <role>org.apache.maven.artifact.handler.ArtifactHandler</role> 
     <role-hint>my-custom-type</role-hint> 
     <implementation> 
     org.apache.maven.artifact.handler.DefaultArtifactHandler 
     </implementation> 
     <configuration> 
     <!--the extension used by Maven in the repository--> 
     <extension>foobar</extension> 
     <!--the type used when specifying dependencies etc.--> 
     <type>my-custom-type</type> 
     <!--the packaging used when declaring an implementation of 
      the packaging--> 
     <packaging>my-custom-type</packaging> 
     </configuration> 
    </component> 
    </components> 
</component-set> 

फिर एक पोम कस्टम पैकेजिंग है कि में, पैकेजिंग तत्व में आवश्यक प्रकार ऐलान करते हैं और सुनिश्चित करें कि आप प्लगइन निर्दिष्ट किया है तो कस्टम पैकेजिंग योगदान किया जा सकता है। < एक्सटेंशन > सत्य </एक्सटेंशन > मैवेन को बताता है कि प्लगइन पैकेजिंग और/या हैंडलर को मेवेन में टाइप करता है।

<project xmlns="http://maven.apache.org/POM/4.0.0" 
     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
     xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 
          http://maven.apache.org/maven-v4_0_0.xsd"> 
    <modelVersion>4.0.0</modelVersion> 
    <groupId>name.seller.rich</groupId> 
    <artifactId>test</artifactId> 
    <version>0.0.1-SNAPSHOT</version> 
    <packaging>my-custom-type</packaging> 
    <build> 
    <plugins> 
     <plugin> 
     <groupId>name.seller.rich.maven.plugins</groupId> 
     <artifactId>maven-foobar-plugin</artifactId> 
     <version>0.0.1</version> 
     <!--declare that this plugin contributes the component extensions--> 
     <extensions>true</extensions> 
     </plugin> 
    </plugins> 
    </build> 
</project> 

जब इस परियोजना से पैक किया जाता है, यह एक जार, एक .jar विस्तार के साथ हो जाएगा लेकिन जब यह स्थापित किया गया है/तैनात, Maven फ़ाइल ".foobar" विस्तार के साथ भंडार करने के लिए निर्दिष्ट के रूप में वितरित कर देगा components.xml में

+1

क्या फ़ोबबार एक्सटेंशन के साथ प्रोजेक्ट में बनाई गई फ़ाइल को रखने का कोई तरीका है? –

+1

और क्या आपका मतलब एमईटी-आईएनएफ या मेटा-आईएनएफ है? –

+0

मुझे ऐसा लगता है कि आपको जार आर्काइवर को कस्टम कार्यान्वयन के साथ प्रतिस्थापित करना होगा, या वैकल्पिक रूप से एक चरण में एक असेंबली-प्लगइन आमंत्रण को बाध्य करने के लिए लाइफसाइकिल.एक्सएमएल का उपयोग करना होगा (आपके अन्य प्रश्न के अनुसार: http: // stackoverflow। कॉम/प्रश्न/1427740/कैसे-करें-i-execute-a-set-of-target-before-my-maven-plugin-run/1427783 # 1427783) –

3

रिच विक्रेता के मूल जवाब पर बाद:

हैं के रूप में वह अनुशंसा परियोजना जहाँ आप अपने प्लगइन संदर्भ में तो एक पैकेजिंग प्रकार jar का उपयोग सबसे अधिक संभावना है आप प्राप्त करेंगे:

[INFO] ------------------------------------------------------------------------ 
[ERROR] FATAL ERROR 
[INFO] ------------------------------------------------------------------------ 
[INFO] The plugin descriptor for the plugin Plugin [com.ocado.mvn.packaging:Jar-Gem] was not found. Please verify that the plugin JAR /home/ndb/.m2/repository/com/ocado/mvn/packaging/Jar-Gem/1.0.0/Jar-Gem-1.0.0.jar is intact. 

ऐसा इसलिए है क्योंकि जेनरेट किए गए जेएआर में कोई प्लगइन डिस्क्रिप्टर मौजूद नहीं है।

<packaging>maven-plugin</packaging> 

<build> 
    <plugins> 
     <plugin> 
      <groupId>org.apache.maven.plugins</groupId> 
      <artifactId>maven-plugin-plugin</artifactId> 
      <version>3.1</version> 
      <configuration> 
       <skipErrorNoDescriptorsFound>true</skipErrorNoDescriptorsFound> 
      </configuration> 
     </plugin> 
    </plugins> 
</build> 

यह विन्यास प्लगइन डॉक्स उदाहरण here में पाया गया था:

आप No mojo definitions.. त्रुटि वह उल्लेख है बायपास करने के लिए निम्न का उपयोग कर सकते हैं।

maven-plugin पैकेजिंग प्रकार जीवन चक्र plugin:descriptor लक्ष्य generate-resources चरण से जुड़ा हुआ है। यह Sonatype's official documentation में निर्दिष्ट है।

+1

इस मामले में 'जार' पैकेजिंग का उपयोग करना सही है। क्योंकि इसमें कोई मोोज नहीं है, जो आप बना रहे हैं वह एक एक्सटेंशन है, प्लगइन नहीं। इसलिए आपको इसे [''] (http://maven.apache.org/pom.ht) से लोड करने की आवश्यकता है एमएल # एक्सटेंशन) [''] (http://maven.apache.org/pom.html#Plugins) अनुभाग के बजाय पीओएम का अनुभाग। ऐसा करने से "प्लगइन डिस्क्रिप्टर नहीं मिला" त्रुटि को रोक देगा। –

+0

@ सैमहेन्स इस सुधार के लिए धन्यवाद। मैंने अपनी पोस्ट से ".. का उपयोग जार .." को हटा दिया है। – KomodoDave

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