2012-06-11 16 views
28

के साथ एक uberjar का निर्माण मैं एक ग्रैडल नौसिखिया हूँ। मैं एक uberjar (AKA fatjar) बनाना चाहता हूं जिसमें परियोजना की सभी पारगमन निर्भरताएं शामिल हों। मुझे अपने "build.gradle" में जोड़ने के लिए किन लाइनों की आवश्यकता है?ग्रैडल

task uberjar(type: Jar) { 
    from files(sourceSets.main.output.classesDir) 

    manifest { 
     attributes 'Implementation-Title': 'Foobar', 
       'Implementation-Version': version, 
       'Built-By': System.getProperty('user.name'), 
       'Built-Date': new Date(), 
       'Built-JDK': System.getProperty('java.version'), 
       'Main-Class': mainClassName 
    } 
} 
+2

आप इसके बजाय [एप्लिकेशन प्लग-इन] (http://www.gradle.org/docs/current/userguide/application_plugin.html) का उपयोग करने का प्रयास करना चाह सकते हैं। – Scott

+0

यह तब तक काम करेगा जब तक आपकी कोई निर्भरता न हो। लेकिन एक बार आपकी परियोजना पर निर्भरता हो जाने पर उन्हें उबेर में बंडल नहीं किया जाएगा। –

उत्तर

29

आप gradle cookbook में fatjar उदाहरण की कोशिश की है (मैं इसे कहीं कुछ दिनों से वापस की नकल की है, लेकिन जहां से याद नहीं है।):

यह मैं वर्तमान में क्या है?

jar { 
    from(configurations.compile.collect { it.isDirectory() ? it : zipTree(it) }) { 
     exclude "META-INF/*.SF" 
     exclude "META-INF/*.DSA" 
     exclude "META-INF/*.RSA" 
    } 

    manifest { 
     attributes 'Implementation-Title': 'Foobar', 
       'Implementation-Version': version, 
       'Built-By': System.getProperty('user.name'), 
       'Built-Date': new Date(), 
       'Built-JDK': System.getProperty('java.version'), 
       'Main-Class': mainClassName 
    } 
} 

बहिष्करण की जरूरत है क्योंकि उनकी अनुपस्थिति में आप this मुद्दा मारा जाएगा:

क्या आप देख रहे हैं Gradle

+0

सूचक के लिए धन्यवाद। यह मदद करता है। हालांकि मैंने एक और मुद्दा मारा जो थोड़ी सी गुगल द्वारा हल किया गया था। मैं उस पर विस्तार करने वाला एक और जवाब जोड़ूंगा। – missingfaktor

+0

ऐसा लगता है कि कुकबुक को अब लॉगिन की आवश्यकता है। जैसा कि मैं वही हूं जो मैं ढूंढ रहा हूं, क्या आप यहां नुस्खा पेस्ट कर सकते हैं? – tarzan

+0

@tarzan तीन साल बाद, और अब मैं छाया प्लगइन का उपयोग करूंगा https://github.com/johnrengelman/shadow –

34

के लिए the shadow plugin है मैं निम्नलिखित के साथ task uberjar(.. बदल दिया।

+4

मुझे लगता है कि इसे सभी रनटाइम निर्भरताओं को शामिल करने के लिए 'configurations.runtime' का उपयोग करना चाहिए – lyomi

+0

मुझे uberjar – gladiator

5

मुझे यह project बहुत उपयोगी मिला। इसे संदर्भ के रूप में उपयोग करते हुए, मेरा ग्रैडल uberjar कार्य

task uberjar(type: Jar, dependsOn: [':compileJava', ':processResources']) { 
    from files(sourceSets.main.output.classesDir) 
    from configurations.runtime.asFileTree.files.collect { zipTree(it) } 

    manifest { 
     attributes 'Main-Class': 'SomeClass' 
    } 
} 
+0

में फ़ाइलों को' जावा/मुख्य/संसाधन 'में प्राप्त करने के लिए मैनिफेस्ट के नीचे' जार 'के साथ जोड़ने की आवश्यकता है, मुझे 'अवैध हस्ताक्षर फ़ाइल पचाना मिलता है मैनिफेस्ट मुख्य विशेषताओं 'के लिए जब मैं इस –

+0

को आजमाता हूं तो आपको मेटा-आईएनएफ/* एसएफ "' "बाहर निकालना होगा" मेटा-आईएनएफ/*। डीएसए "' ' बाहर निकालें "मेटा-आईएनएफ/* आरएसए" missingfaktor के जवाब की तरह wer –

5

बस इसे अपने जावा मॉड्यूल के build.gradle में जोड़ें।

mainClassName = "my.main.Class"

jar { 
    manifest { 
    attributes "Main-Class": "$mainClassName" 
    } 

    from { 
    configurations.compile.collect { it.isDirectory() ? it : zipTree(it) } 
    } 
} 

यह/निर्माण/libs/[MODULE_NAME] .jar फ़ाइल में [MODULE_NAME] परिणाम देगा।

+0

लेकिन वह कोड क्या है? Configurations.compile.collect {it.isDirectory() क्या करता है? यह: ज़िप (यह)} करते हैं? –

+1

@SamRedway 'configurations.compile.collect'' compile' से सामान एकत्र करता है टर्नरी इसे फ़ोल्डर्स और ज़िप-फ़ाइलों (जैसे जार) में खींचने देता है जैसे कि वे – pal

+0

फ़ोल्डर्स भी थे, मैंने पोस्ट किए गए अन्य संस्करणों की कोशिश नहीं की है यहां, लेकिन यह अच्छी तरह से काम करता है और अच्छा और सरल है। – chris

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