2011-04-19 27 views
10

मेरे पास वर्तमान में जावा परीक्षण लाइब्रेरी है जो मैवेन के साथ बनाई गई है, और एक जार के रूप में वितरित की गई है। मेरी परियोजना एक बहुत ही सामान्य पुस्तकालय (ऑब्जेक्टवेब एएसएम) पर निर्भर करती है, और मैंने उन समस्याओं का अनुभव किया है जहां एएसएम का पहले और असंगत संस्करण पहले से ही कक्षापाथ पर है। इस प्रकार, मैंने जार बनाने के लिए jarjar-maven-plugin का उपयोग शुरू कर दिया है, एएसएम को आंतरिक रूप से दोबारा तैयार करना जहां यह एएसएम के दूसरे संस्करण के साथ संघर्ष नहीं कर सकता है।मैवेन के साथ जारजेरड आर्टिफैक्ट कैसे बनाएं, जहां आर्टिफैक्ट का उपयोग ट्रांजिटिव निर्भरताओं को नहीं खींचता है?

यह ठीक निष्पादित करता है, और मेरी लाइब्रेरी को किसी समस्या के साथ निर्भरता के रूप में खींचा जा सकता है।

हालांकि, क्योंकि मेरे प्रोजेक्ट में एएसएम पर संकलन-स्कोप निर्भरता है, जब भी कोई क्लाइंट प्रोजेक्ट मेरी लाइब्रेरी जोड़ता है, तो ट्रांजिटिव निर्भरता सभी भी खींची जाती है। तो, hypothetically, अगर वे एएसएम के एक विशेष संस्करण का उपयोग करते हैं, और वे वर्गपैथ पर निर्भर संस्करण भी जोड़ते हैं, तो उनके पास अपरिभाषित व्यवहार है। मैं इस परिस्थिति से बचना चाहता हूं, और ग्राहकों को जारजर्ड आर्टिफैक्ट पर निर्भर रहने की इजाजत देता हूं बिना मैवेन को अनावश्यक रूप से और संभावित रूप से खतरनाक निर्भरता को पारगम्य निर्भरताओं को खींचने के बिना।

मैं एक जारजर्ड आर्टिफैक्ट कैसे बना सकता हूं जो उपयोगकर्ता ट्रांसमिटिव निर्भरताओं को खींचने के बिना निर्भर कर सकते हैं?

उत्तर

17

मुझे जर्जर-मैवेन-प्लगइन को मिटाने और मैवेन-शेड-प्लगइन पर वापस जाकर इस समस्या का समाधान मिला। यह आपके नामस्थान के भीतर कक्षाओं को पुन: व्यवस्थित करने, जार की मुख्य श्रेणी को सेट करने की अनुमति देता है, और महत्वपूर्ण रूप से, उत्पन्न पॉम को पर पर पुन: लिखने की अनुमति देता है जो अब संकलित समय निर्भरता शामिल है।

मेरी pom.xml जो इस प्राप्त का हिस्सा है:

<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> 

      <shadedArtifactAttached>false</shadedArtifactAttached> 
      <createDependencyReducedPom>true</createDependencyReducedPom> 

      <relocations> 
       <relocation> 
        <pattern>org.objectweb.asm</pattern> 
        <shadedPattern>${repackage.base}.org.objectweb.asm</shadedPattern> 
       </relocation> 
      </relocations> 
      <transformers> 
       <transformer 
        implementation="org.apache.maven.plugins.shade.resource.ManifestResourceTransformer"> 
        <mainClass>${package.base}.my.MainClass</mainClass> 
       </transformer> 
      </transformers> 
     </configuration> 
    </execution> 
</executions> 

इस विन्यास के महत्वपूर्ण हिस्से हैं:

  • shadedArtifactAttached जो जब गलत पर सेट है, जिसका अर्थ छायांकित जार मुख्य आर्टिफैक्ट को प्रतिस्थापित करेगा जो आमतौर पर उत्पादित किया जाएगा। यह गलत पर डिफ़ॉल्ट है लेकिन यह इंगित करने लायक है।
  • createDependencyReducedPom जो सही पर सेट करते हैं, इसका मतलब है कि जब छायांकित जार तैनात या स्थापित किया जाता है, तो pom.xml जो तैनात किया जाता है, में संकलन-स्कोप निर्भरता शामिल नहीं होती है जिसे जार में दोबारा बनाया गया है।
  • relocation ये तत्व कॉन्फ़िगर करते हैं कि निर्भरताओं के भीतर फ़ाइलों को छायांकित जार में कैसे पुनर्स्थापित किया जाता है। उपर्युक्त उदाहरण में किसी भी वर्ग का कैनोनिकल नाम org.objectweb.asm से शुरू होता है ${package.base}.org.objectweb.asm पर ले जाया जाएगा, और इस प्रकार जब जार में पैक किया गया तो जार के बराबर फ़ाइल पथ होगा।

इस कॉन्फ़िगरेशन के साथ, जब मेरी प्रोजेक्ट तैनात की जाती है, जब क्लाइंट मेरी प्रोजेक्ट पर संकलन-स्कोप निर्भरता घोषित करते हैं, तो यह केवल छायांकित जार में खींचता है, और कोई संक्रमणीय निर्भरता नहीं होती है।

+0

यह प्लगइन भयानक है, हमें निर्भरता नरक से बचाया ... – erdogany

0

शायद <optional> विशेषता सेट करना आपके मामले में काम करेगा। अपने जावा परीक्षण लाइब्रेरी पोम में निम्न की तरह कुछ निर्दिष्ट करना।

<dependencies> 
    <dependency> 
     <groupId>asm.group</groupId> 
     <artifactId>asm</artifactId> 
     <version>x.y</version> 
     <optional>true</optional> 
    </dependency> 
    ... 
    </dependencies> 
1

इसके बजाय मेवेन-शेड-प्लगइन की कोशिश करने पर विचार करें, जो सभी प्रकार के अच्छे नियंत्रण की अनुमति देता है।

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

  • कोई संबंधित समस्या नहीं^_^