2010-06-30 17 views
12

मेरे पास एक परिदृश्य है जहां मुझे सभी मॉड्यूल और उनकी निर्भरताओं समेत एक बहु मॉड्यूल मेवेन प्रोजेक्ट का uber जार बनाने की आवश्यकता है। मैंने मेवेन छाया प्लगइन का उपयोग करने की कोशिश की। लेकिन ऐसा लगता है जब मैं इसे मॉड्यूल स्तर पर उपयोग करता हूं। मैं माता पिता पोम में प्लगइन प्रवेश तो निर्माण टूटता जोड़ देते हैं तोएक बहु मॉड्यूल प्रोजेक्ट में मेवेन छाया प्लगइन का उपयोग करना - NullPointerException

[INFO] Replacing original artifact with shaded artifact. 
[INFO] Replacing null with C:\Projects\foo.bar\target\foobar-0.0.1-SNAPSHOT-shaded.pom 
[INFO] ------------------------------------------------------------------------ 
[ERROR] BUILD ERROR 
[INFO] ------------------------------------------------------------------------ 
[INFO] Error creating shaded jar: null: NullPointerException -> [Help 1] 

यह समझ बनाने के लिए के बाद से माता-पिता Maven परियोजना के लिए <packaging> पोम है प्रतीत होता है (यह माता पिता पोम छाया की कोशिश करता है)। लेकिन एक बहु मॉड्यूल परियोजना के लिए uber जार बनाने का कोई तरीका होना चाहिए ... किसी भी विचार लोग ???

+0

संभावित वैकल्पिक हल: व्यक्तिगत मॉड्यूल जार के लिए निर्भरता के साथ एक Maven परियोजना बना सकते हैं और इस परियोजना पर शेडर प्लगइन का उपयोग – Manoj

+2

संभावित नहीं है, यह सही समाधान है। –

उत्तर

13

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

यहां documentation पीओएम संबंधों और समेकन और विरासत के बीच अंतर समझाता है।

+0

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

+0

@ एड्रियन शम - मेरी सबसे अच्छी सलाह यह सुनिश्चित करने के लिए प्लगइन के दस्तावेज़ीकरण को पढ़ना होगा कि आपका उपयोग सही काम कर रहा है। http: //maven.apache।संगठन/प्लगइन्स/मेवेन-शेड-प्लगइन/यदि आपको अभी भी समस्याएं हैं, तो मेरे लिए किसी भी कोड/कॉन्फ़िगरेशन के बिना आपकी सहायता करना मुश्किल है। एक और सवाल पोस्ट करें जितना संभव हो उतना विवरण बताएं कि आप क्या हासिल करने की कोशिश कर रहे हैं और आप किस समस्या का सामना कर रहे हैं। अपने पोम की छाया-प्लगइन कॉन्फ़िगरेशन को शामिल करना न भूलें। फिर यहां प्रश्न से लिंक करें और मैं देखूंगा कि मैं आपकी मदद कर सकता हूं या नहीं। –

+0

आप पंप पैक किए गए एग्रीगेटर को जार के रूप में आउटपुट करने के लिए मजबूर करने के लिए outputFile कॉन्फ़िगरेशन का उपयोग कर सकते हैं। यानी लक्ष्य/foo_bar.jar। शायद समर्थित नहीं है, लेकिन यह काम करता है – mlathe

3

हाँ! आप ऐसा कर सकते हैं ! :-)

छाया में एक कार्यान्वयन समस्या है: यह नहीं पता कि पोम (जार या वेब नहीं) पर चल रहा है। पोम परियोजनाएं बाइनरी कलाकृतियों को उत्पन्न नहीं करती हैं, फिर छाया को एनपीई फेंकने, मर्ज करने, स्थानांतरित करने, आदि फ़ाइलों को नहीं मिलती है।

इस समस्या को हल करने के लिए, अपने aggegate-Pom प्रोजेक्ट से एक मूल पीओएम बनाएं। यह अंदर, छाया परिभाषाएँ और विन्यास कुछ प्रोफ़ाइल (। जैसे alwaysActiveProfiles) को विन्यस्त करने डाल दिया और स्थापित/आदेश के साथ ही नियोजित करें:

mvn तैनात -पी -alwaysActiveProfiles

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

<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>xxxxxxxx</groupId> 
<artifactId>web-pom</artifactId> 
<name>web-pom</name> 
<version>1.0.0-SNAPSHOT</version> 
<packaging>pom</packaging> 

<build> 
    <pluginManagement> 
     <plugins> 
      <plugin> 
       <groupId>org.apache.maven.plugins</groupId> 
       <artifactId>maven-shade-plugin</artifactId> 
       <version>1.4</version> 
       <executions> 
        <execution> 
         <phase>package</phase> 
         <goals> 
          <goal>shade</goal> 
         </goals> 
         <configuration> 
          ... 
         </configuration> 
        </execution> 
       </executions> 
      </plugin> 
     </plugins> 
    </pluginManagement> 
</build> 
<dependencies> 
    ... 
</dependencies> 

<profiles> 
    <profile> 
     <id>alwaysActiveProfiles</id> 
     <build> 
      <plugins> 
       <plugin> 
        <groupId>org.apache.maven.plugins</groupId> 
        <artifactId>maven-shade-plugin</artifactId> 
       </plugin> 
      </plugins> 
     </build> 
    </profile> 
</profiles> 

, याद रखें कि आपके setting.xml alwaysActiveProfiles डिफ़ॉल्ट रूप से सक्षम होना आवश्यक है अन्यथा छाया अपने dependences छाया-पोम परियोजनाओं में नहीं चलेंगे।

2

मैं प्लगइन का संस्करण 1.6 के साथ एक ही समस्या हो रही थी, मैं 2.2 के लिए अद्यतन और समस्या हल हो गया था