2010-11-03 10 views
30

में "मूल" के साथ उपसर्ग किया गया है, मैं एक साथ बंडल किए गए सभी जावा निर्भरताओं के साथ एक मोनोलिथिक जार बनाने के लिए "छाया" Maven2 प्लगइन का उपयोग कर रहा हूं। pom.xml के प्रासंगिक अनुभागों बिल्कुल स्पष्ट है:मेवेन "छायांकित" JAR फ़ाइल नाम

<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> 
       <finalName>${project.artifactId}-${project.version}-SHADED</finalName> 
       <transformers> 
        <transformer implementation="org.apache.maven.plugins.shade.resource.ManifestResourceTransformer"> 
         <mainClass>com.mypackage.MyClass</mainClass> 
        </transformer> 
       </transformers> 
      </configuration> 
     </execution> 
    </executions> 
</plugin> 

हालांकि, निर्माण परिणाम अजीब हैं। ऐसा लगता है कि दो फ़ाइलों वास्तव में इस Maven प्लगइन द्वारा बनाई गई हैं:

myartifact-1.0.0-SHADED.jar (zero bytes) 
original-myartifact-1.0.0-SHADED.jar (10 MB) 

उपसर्ग के साथ JAR फ़ाइल "मूल" ठीक से बनाया गया है, और कार्यों ठीक। मुझे लगता है कि मैं उस उपसर्ग को तोड़ने के लिए बस इसका नाम बदल सकता हूं, और अपने मजेदार तरीके से जा सकता हूं।

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

+2

आप स्टीवर्ट के उत्तर में अपना चेक मार्क स्विच करने पर विचार कर सकते हैं। – Gray

+0

'/tmp' सेट करने के लिए चारों ओर एक कार्य है। 'मूल - *। Jar' फ़ाइल अभी भी लिखी गई है, लेकिन कम से कम यह विकास पथ में नहीं है। –

उत्तर

19

मेवेन के निर्माण चरण जार target/artifact-version.jar बनाएंगे।

फिर छाया प्लगइन चलाता है। यह आमतौर पर target/original-artifact-version.jar पर जार का नाम बदलता है, और छायांकित JAR नाम target/artifact-version.jar देता है।

हालांकि, आप एक अलग नाम का उपयोग करने के लिए छाया प्लगइन को कॉन्फ़िगर कर रहे हैं। जब तक इसके लिए कोई अच्छा कारण न हो, मैं आपकी कॉन्फ़िगरेशन से <finalName> हटा दूंगा, और छाया प्लगइन आपको जो देना चाहता हूं उसके साथ रहें।

+10

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

+2

ओह, आप पर पकड़ने का इरादा नहीं, एनन ... बस मेवेन और उसके नियमित समुदाय में सामान्य रूप से पकड़ना! :) तुम्हारी सहायता सराहनीय है। –

+0

@ स्टेव - कोई अपराध नहीं लिया गया। मेरा विश्वास करो, मैं लगातार मेवेन में पकड़ता हूं। अभी मैं पकड़ रहा हूं क्योंकि मैं आसानी से मेरी सेटिंग्स में तैनाती यूआरएल को ओवरराइड नहीं कर सकता। एक्सएमएल :-) और कभी-कभी मुझे यह पता लगाने के लिए सोर्स कोड देखना पड़ता था कि क्या गलत हुआ। – Anon

33

मुझे पता है कि यह प्रश्न पुराना है, लेकिन सोचा कि यह निम्नलिखित जानकारी जोड़ने लायक था।

मुझे लगता है कि स्टीव द्वारा मूल रूप से वांछित आउटपुट यह है कि maven-shade-plugin documentation के इस पृष्ठ पर दिया गया है।

<shadedArtifactAttached>true</shadedArtifactAttached> 
<shadedClassifierName>jar-with-dependencies</shadedClassifierName> 
4

(करने के लिए या तो कोई अपराध: डी): एक थोड़ा बेहतर जवाब प्रदान करने पर @Stewart बाद

कारण आप original- * गंदगी दुगना हो सकता है मिलती है:

  1. निर्दिष्ट करना <finalName> का अर्थ है कि आप डिफ़ॉल्ट रूप से मेवेन को जो कुछ देता है उससे अलग नाम चाहते हैं (यानी: आर्टिफैक्ट का नाम: artifactId-version.jar या artifactId-version-shaded.jar)। यदि आप अंतिम नाम निर्दिष्ट करते हैं जो कि दोनों में से एक जैसा है, तो यह पुराने को मूल - *। Jar के रूप में वापस करने का प्रयास करेगा और फिर उसे नए छायांकित के साथ ओवरराइट करेगा। आपके मामले में, आप इसे अंतिम JAR * -shaded.jar बनाने के लिए कह रहे हैं, जो पहले से ही मामला है जब यह मेवेन से बाहर आता है (डिफ़ॉल्ट रूप से इसे artifactId-version.jar में बनाते हैं), तो यह पहले बैक पुराने *-shaded.jar को original-*-shaded.jar के रूप में और फिर नए *-shaded.jar पर बाइट्स लिखते समय बग बाहर निकाला गया, पुराना गायब हो गया (वे इसका नाम बदलते हैं)।

  2. (जो मेरा मामला था) <shadedClassifierName> का उपयोग करके, जो केवल 0xके संयोजन में * -shaded.jar उत्पन्न करने के लिए प्रत्यय मेवेन का उपयोग करता है, वही परिणाम भी प्राप्त कर सकता है। यदि आप चाहते हैं कि आप केवल <shadedClassifierName> का उपयोग कर सकते हैं और एक अलग प्रत्यय निर्दिष्ट कर सकते हैं और पूरी चीज़ के साथ <finalName> निर्दिष्ट किए बिना इसके साथ किया जा सकता है। मेरे मामले में मैंने दोनों को आउटपुट नाम देने के लिए सेट किया था: यानी: artifactId-version-all.jar लेकिन क्लासिफायर के रूप में 'सभी' का उपयोग करके मुझे # 1 में वर्णित परिदृश्य में वापस लाया।

+1

आप का भी उपयोग करना चाहेंगे, लेकिन इसका मतलब यह है कि आप मूल के साथ इसे स्थापित/तैनात करने के बाद मेवेन रेपो में छायांकित आर्टिफैक्ट चाहते हैं। जब इसे नाम देने की बात आती है तो वास्तव में कुछ भी नहीं बदलता है। –

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