2015-01-30 7 views
8

हमें मेवेन का उपयोग करके एक जार बनाने की जरूरत है, जिस तरह से इसकी सभी निर्भरताओं को शामिल किया गया है, लेकिन यह भी कि उन सभी निर्भरताओं का नाम बदल दिया गया है (स्थानांतरित)।मेवेन - क्या सभी निर्भरताओं को स्थानांतरित करने के साथ आसानी से 'उबर' जार बनाने का कोई तरीका है?

, मैं कर रहा हूँ के हमारे अपने संकुल सभी com.mycompagny.projectx.* के साथ शुरू मान लीजिए "। हम चाहते हैं कि परियोजना निर्भरता उनके पैकेज के साथ शुरू होता है के लिए नाम बदला है," embedded "नहीं, बल्कि हमारे अपने वर्गों।

उदाहरण के लिए maven-shade-plugin का उपयोग करना इस लक्ष्य को हासिल नहीं कर पा रहे हैं:।

<plugin> 
    <groupId>org.apache.maven.plugins</groupId> 
    <artifactId>maven-shade-plugin</artifactId> 
    <version>2.3</version> 
    <configuration> 
     <shadedArtifactAttached>true</shadedArtifactAttached> 
     <createDependencyReducedPom>true</createDependencyReducedPom> 
     <artifactSet> 
      <includes> 
       <include>*.*</include> 
      </includes> 
     </artifactSet> 
     <relocations> 
      <relocation> 
       <pattern>*</pattern> 
       <shadedPattern>embedded.</shadedPattern> 
       <excludes> 
        <exclude>com.mycompagny.projectx.*</exclude> 
       </excludes> 
      </relocation> 
     </relocations> 
    </configuration> 
    <executions> 
     <execution> 
      <phase>package</phase> 
      <goals> 
       <goal>shade</goal> 
      </goals> 
     </execution> 
    </executions> 
</plugin> 

यहाँ <pattern>*</pattern> मान्य नहीं है इसके अलावा, अगर मैं <pattern></pattern> (रिक्त स्ट्रिंग) का उपयोग करें, तो सब कुछ "एम्बेडेड" पैकेज के लिए, भी संसाधनों जगह बदली है ("मेटा -आईएनएफ "डीआई रेक्टरी भी)! बेशक हम चाहते हैं कि संसाधन जार की जड़ पर बने रहें।

मुझे लगता है कि हम कई <relocation> तत्वों, निर्भरता से प्रत्येक पैकेज के लिए एक बना सकते हैं, लेकिन यह बहुत काम होगा: <relocation>com</relocation>, <relocation>net</relocation>, <relocation>javax</relocation>, आदि

कितनी आसानी से स्थानांतरित करने के लिए पर कोई विचार सभी उबर जार के अंदर निर्भरता, अपने स्वयं के वर्गों, संसाधनों और "मेटा-आईएनएफ" निर्देशिका को छूए बिना?

उत्तर

6

अद्यतन: यह समाधान वास्तव में काम नहीं करता है, कृपया अंत तक पढ़ें।

मुझे maven-shade-plugin के स्रोत कोड को देखकर एक समाधान मिला! यह कहीं भी प्रलेखित किया जाना प्रतीत नहीं होता है, लेकिन वहाँ एक <rawString> पैरामीटर है कि आप एक <relocation> तत्व को जोड़ सकते हैं तो यह <pattern> और <shadedPattern> consideres नियमित अभिव्यक्ति पैटर्न के रूप में और नहीं पैकेज/फ़ाइल नाम के रूप में है।

path.replaceAll(pattern, shadedPattern) 

उन पैटर्न के साथ सौदा करने के लिए:

maven-shade-plugin कोड तो की तरह कुछ का उपयोग करता है।

उदाहरण:

<relocation> 
    <pattern>^([^/]*\.properties)$</pattern> 
    <shadedPattern>embedded/$1</shadedPattern> 
    <rawString>true</rawString> 
</relocation> 

यह एक डमी उदाहरण है जो सभी .properties फ़ाइलें जो जड़ में हैं स्थानांतरित किया है। इस तकनीक का उपयोग करके, यह नियंत्रित करना संभव होगा कि वास्तव में क्या स्थानांतरित किया गया है और कैसे, मुझे पूरा यकीन है।

<relocation> 
    <pattern>^(?!(com/mycompagny/|META-INF))(.*/.*)$</pattern> 
    <shadedPattern>embedded/$2</shadedPattern> 
    <rawString>true</rawString> 
</relocation> 

अद्यतन:

यहाँ एक बेहतर उदाहरण है जो कि मैं क्या (अभी भी कुछ है, हालांकि ऐसा करने के लिए परीक्षण) की आवश्यकता है है, दुख की बात है, यह पिछले पैटर्न का मतलब है कि इस्तेमाल किया सब कुछ, बदल दिया जाएगा "कॉम को छोड़कर। mycompagny "और मेटा-आईएनएफ फ़ोल्डर। समस्या यह है कि java.lang.Object जैसी चीजें बदल दी जाएंगी! और जब कोड चलाया जाता है, तो इस तरह के अपवाद फेंक दिए जाएंगे:

java.lang.ClassNotFoundException: embedded.java.lang.Object 
+0

हालांकि इसने आपकी समस्या का समाधान नहीं किया ... यह _IS_ एक बेहद उपयोगी अनियंत्रित सुविधा है।मेरे पास ऐसे संसाधन हैं जिन्हें किसी भिन्न फ़ोल्डर में स्थानांतरित करने की आवश्यकता है (स्रोत कोड नहीं, और पैकेज संरचना में नहीं)। अद्यतित करने के लिए धन्यवाद। – Lucas

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

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