2009-12-02 4 views
26

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

प्रकट फ़ाइल:

 
..... 
Main-Class : com.acme.MainClass 
Class-Path : dependecy1.jar dependecy2.jar 
..... 

जार:

 
jar-root 
|-- .... 
|-- com/acme/../*.class 
|-- dependecy1.jar 
`-- dependecy2.jar 

मैं प्रकट फ़ाइल बनाने के लिए Maven-जार-प्लगइन का उपयोग कर रहा है और Maven-छाया "यूब बनाने के लिए प्लगइन एर "जार लेकिन निर्भरताओं को अनपॅक किया गया है और मेरे जार में कक्षाओं के रूप में जोड़ा गया है।

उत्तर

56

असल में, मैंने यह नहीं देखा कि maven-shade-plugin वास्तव में (या कोई अन्य प्लगइन) कर रहा है क्योंकि मैवेन 2 में मेगाजर या उबेरजर बनाने के लिए सब कुछ बनाया गया है। आपको केवल पूर्वनिर्धारित jar-with-dependencies डिस्क्रिप्टर के साथ मेवेन-असेंबली-प्लगइन का उपयोग करना होगा। फिर

mvn assembly:assembly -DdescriptorId=jar-with-dependencies 

लेकिन,, इस वर्णनकर्ता के डिफ़ॉल्ट व्यवहार है:

बस अपने pom.xml को यह स्निपेट जोड़ने प्रकट अनुकूलित करने के लिए:

<plugin> 
    <groupId>org.apache.maven.plugins</groupId> 
    <artifactId>maven-assembly-plugin</artifactId> 
    <configuration> 
    <archive> 
     <manifest> 
     <mainClass>my.package.to.my.MainClass</mainClass> 
     </manifest> 
    </archive> 
    </configuration> 
</plugin> 

और निम्न आदेश अपने uberjar उत्पन्न होगा निर्भरताओं को अनपैक करने के लिए (मैवेन-शेड-प्लगइन की तरह)। ईमानदार होने के लिए, मुझे नहीं लगता कि यह एक समस्या क्यों है, लेकिन यदि यह वास्तव में आप नहीं चाहते हैं, तो आप अपने स्वयं के कस्टम असेंबली डिस्क्रिप्टर का उपयोग कर सकते हैं।

पहले ऐसा करने के लिए, अपने विधानसभा वर्णनकर्ता बनाने के लिए, के निम्नलिखित सामग्री के साथ src/assembly/uberjar.xml कहते हैं, करते हैं:

<assembly> 
    <id>uberjar</id> 
    <formats> 
    <format>jar</format> 
    </formats> 
    <includeBaseDirectory>false</includeBaseDirectory> 
    <dependencySets> 
    <dependencySet> 
     <unpack>false</unpack> 
     <scope>runtime</scope> 
     <useProjectArtifact>false</useProjectArtifact> 
    </dependencySet> 
    </dependencySets> 
    <fileSets> 
    <fileSet> 
     <directory>${project.build.outputDirectory}</directory> 
     <outputDirectory>/</outputDirectory> 
    </fileSet> 
    </fileSets> 
</assembly> 

फिर, Maven-विधानसभा-प्लगइन कॉन्फ़िगर इस वर्णनकर्ता उपयोग करने के लिए और करने के लिए निर्भरता को जोड़ने के लिए प्रकट की Class-Path प्रविष्टि:

<plugin> 
    <groupId>org.apache.maven.plugins</groupId> 
    <artifactId>maven-assembly-plugin</artifactId> 
    <configuration> 
    <descriptors> 
     <descriptor>src/assembly/uberjar.xml</descriptor> 
    </descriptors> 
    <archive> 
     <manifest> 
     <mainClass>my.package.to.my.MainClass</mainClass> 
     <addClasspath>true</addClasspath> 
     </manifest> 
    </archive> 
    </configuration> 
    <!-- 
    <executions> 
    <execution> 
     <phase>package</phase> 
     <goals> 
     <goal>single</goal> 
     </goals> 
    </execution> 
    </executions> 
    --> 
</plugin> 

अंत में mvn assembly:assembly चलाने के लिए अपनी uberjar निर्माण करने के लिए।

वैकल्पिक रूप से executions तत्व package चरण पर असेंबली प्लगइन को बांधने के लिए असम्बद्ध करें (और सामान्य निर्माण के हिस्से के रूप में निर्मित असेंबली है)।

+4

+1, बेहद सहायक उत्तर। मैं कल्पना कर सकता हूं कि कुछ सॉफ्टवेयर उत्पादक, विशेष रूप से ओएस के बाहर, उनके उत्पाद को "डिस्सेम्बलिंग/रिवर्स इंजीनियरिंग" से मना कर सकते हैं, या उनके पैकेजिंग को फ़ाइल नाम इत्यादि के साथ बनाए रखा जा सकता है। –

+1

असेंबली: असेंबली को असेंबली द्वारा प्रतिस्थापित किया गया है : हाल ही में एकल। (मैं असेंबली-प्लगइन संस्करण 2.3 पर हूं) –

+0

असेंबली प्लगइन छाया प्लगइन की तरह एक प्लगइन है, इसलिए यह "निर्माण" नहीं है –

0

मैं दो उत्पादों है कि ऐसा करने के बारे में पता:

  • वन 'bigjar' कहा जाता है, लेकिन वह भी सामान्य एक शब्द एक गूगल खोज में उपयोगी होने के लिए है, मैं इसे खोजने में सक्षम नहीं था।
  • दूसरे को 'वनजर' कहा जाता है। इसमें कुछ संदर्भ हैं, और यह आपको जो चाहिए वह करने का दावा करता है।

यहाँ जो एक Maven विधानसभा में OneJar का उपयोग करता है किसी से एक पोस्ट है:

http://5341.com/list/55/498657.html

2

मैं अतीत में इस के लिए FatJar का उपयोग किया है। http://fjep.sourceforge.net/

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

+0

यह एक ग्रहण प्लगइन है? यदि ऐसा है, तो मैं नहीं देखता कि यह प्रश्न का उत्तर कैसे देता है। ओपी एक मेवेन समाधान मांग रहा है ... –

+0

आप सही हैं, मैंने उस हिस्से को गलत तरीके से पढ़ा है। मुझे लगता है कि मैं सोच रहा था कि इसे अन्य क्षेत्रों में लागू किया जा सकता है, क्योंकि सभी आईडीई स्क्रिप्ट के रैपर के रैपर से थोड़ा अधिक हैं। – Karl

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