2013-02-03 53 views
26

में जार पुस्तकालयों निर्भरता कॉपी करने के लिए मैं इस build.gradleकैसे Gradle

apply plugin: 'java' 
apply plugin: 'application' 

manifest.mainAttributes("Main-Class" : "com.test.HelloWorld") 

repositories { 
    mavenCentral() 
} 

dependencies { 
    compile (
     'commons-codec:commons-codec:1.6', 
     'commons-logging:commons-logging:1.1.1', 
     'org.apache.httpcomponents:httpclient:4.2.1', 
     'org.apache.httpcomponents:httpclient:4.2.1', 
     'org.apache.httpcomponents:httpcore:4.2.1', 
     'org.apache.httpcomponents:httpmime:4.2.1', 
     'ch.qos.logback:logback-classic:1.0.6', 
     'ch.qos.logback:logback-core:1.0.6', 
     'org.slf4j:slf4j-api:1.6.0', 
     'junit:junit:4.+' 
    ) 
} 

के साथ एक runnable जार मिला लेकिन यह विफल रहा है चलाते हैं क्योंकि निर्भरता जार नहीं मिल रहा।

और उसके बाद मैं इस कोड जोड़ें:

task copyToLib(type: Copy) { 
    into "$buildDir/output/libs" 
    from configurations.runtime 
} 

लेकिन कुछ भी परिवर्तन ... मैं फ़ोल्डर उत्पादन/libs नहीं मिल सकता है ...

मैं कैसे कॉपी कर सकते हैं करने के लिए निर्भरता libs जार एक निर्दिष्ट फ़ोल्डर या पथ?

+0

आप कोड कैसे चलाते हैं? –

+0

@PeterNiederwieser Niederwieserfirst मैं चलाएँ: Gradle निर्माण,, runnable जार फ़ाइल मिलता तो जार फ़ाइल को चलाने: जावा जार XXX.jar – jychan

+0

आप शायद सिंक के बजाय कॉपी उपयोग करना चाहते हैं। भी https://docs.gradle.org/current/userguide/working_with_files.html#sec:sync_task – morty

उत्तर

1

आवेदन प्लगइन इस तरह मुख्य वर्ग के नाम सेट करने की आवश्यकता है:

mainClassName = "com.test.HelloWorld" 

आप अपने निर्माण स्क्रिप्ट है कि जोड़ने की आवश्यकता होगी। ध्यान रखें कि यदि आप java कमांड के साथ अपना एप्लिकेशन चलाने का प्रयास करते हैं तो आपको क्लासपाथ को -cp के साथ सेट करने की भी आवश्यकता होगी।

एप्लिकेशन प्लगइन कार्य को distZip प्रदान करके इस प्रक्रिया को सरल बनाता है। यदि आप उस कार्य को चलाते हैं तो build/distributions के तहत आप के लिए एक पूर्ण वितरण बनाया गया है। वितरण में स्क्रिप्ट स्क्रिप्ट और सभी निर्भरताएं होती हैं। जेनरेट की गई प्रारंभ स्क्रिप्ट पहले से ही आपके लिए क्लासपाथ सेट कर चुकी हैं ताकि आपको इससे निपटने की आवश्यकता न हो।

31

जोड़ें:

build.dependsOn(copyToLib) 

gradle build रन Gradle कार्यों बनाता है और जो कुछ भी कार्य निर्भर उस पर (dependsOn द्वारा घोषित) है। build.dependsOn(copyToLib) सेट किए बिना, ग्रैडल कार्य कार्य को बिल्ड कार्य से संबद्ध नहीं करेगा।

तो:

apply plugin: 'java' 
apply plugin: 'application' 

manifest.mainAttributes("Main-Class" : "com.test.HelloWorld") 

repositories { 
    mavenCentral() 
} 

dependencies { 
    compile (
     'commons-codec:commons-codec:1.6', 
     'commons-logging:commons-logging:1.1.1', 
     'org.apache.httpcomponents:httpclient:4.2.1', 
     'org.apache.httpcomponents:httpclient:4.2.1', 
     'org.apache.httpcomponents:httpcore:4.2.1', 
     'org.apache.httpcomponents:httpmime:4.2.1', 
     'ch.qos.logback:logback-classic:1.0.6', 
     'ch.qos.logback:logback-core:1.0.6', 
     'org.slf4j:slf4j-api:1.6.0', 
     'junit:junit:4.+' 
    ) 
} 

task copyToLib(type: Copy) { 
    into "$buildDir/output/libs" 
    from configurations.runtime 
} 

build.dependsOn(copyToLib) 
+0

देखें SonarQube विश्लेषण में, Javacode एएसटी स्कैन के दौरान, मैं हो रही थी त्रुटि/चेतावनी - कक्षा xx.yy.zz नहीं मिला। इसे ठीक करने के लिए, मुझे "sonar.java.libraries" सेट करना पड़ा जिसमें संकलन, परीक्षण कॉम्पाइल, रनटाइम के दौरान आवश्यक सभी जार (निर्भरता) शामिल हैं। मैंने configurations.com से configurations.compile से configurations.testCompile से configurations.runtime "जोड़ा। मुझे "बिल्ड/आश्रित-जार" फ़ोल्डर में सभी जार मिल गए। Sonar.java.libraries = build/dependent-jars/*। Jar को सेट करना मुझे त्रुटि नहीं मिल रही है। धन्यवाद, चूंकि ग्रेडल वर्कस्पेस के बाहर अपने कैश को बनाए रखता है लेकिन इस कोड का उपयोग करके मैं .jar फ़ोल्डर में .jar प्राप्त करने में सक्षम था। –

10

मैं आवेदन प्लगइन रास्ता बहुत बोझिल और इसके उत्पादन में भी वर्बोज़ पाते हैं।

apply plugin: 'java' 
apply plugin: 'java-library-distribution' 

repositories { 
    mavenCentral() 
} 

dependencies { 
    compile 'org.apache.commons:commons-lang3:3.3.2' 
} 

// Task "distZip" added by plugin "java-library-distribution": 
distZip.shouldRunAfter(build) 

jar { 
    // Keep jar clean: 
    exclude 'META-INF/*.SF', 'META-INF/*.DSA', 'META-INF/*.RSA', 'META-INF/*.MF' 

    manifest { 
     attributes 'Main-Class': 'com.somepackage.MainClass', 
        'Class-Path': configurations.runtime.files.collect { "lib/$it.name" }.join(' ') 
    } 
    // How-to add class path: 
    //  http://stackoverflow.com/questions/22659463/add-classpath-in-manifest-using-gradle 
    //  https://gist.github.com/simon04/6865179 
} 

एक सार here के रूप में होस्ट किया गया: यहाँ कैसे मैं अंत में एक सेटअप के साथ मैं खुश था, जैसे कि, उप-निर्देशिका /lib में निर्भरता जार के साथ एक वितरण ज़िप फ़ाइल बनाने और मैनिफ़ेस्ट फ़ाइल में Class-Path प्रवेश करने के लिए सभी निर्भरता जोड़ने मिला है।

परिणाम build/distributions में पाया जा सकता है और अनज़िप सामग्री इस तरह दिखेगा:

lib/कॉमन्स-lang3-3.3.2.jar
MyJarFile.jar

विषय- MyJarFile.jar#META-INF/MANIFEST.mf:

प्रकटीकरण-संस्करण: 1.0
मुख्य श्रेणी: com.somepackage.MainClass
कक्षा-पथ: lib/commons-lang3-3.3.2।जार

+1

धन्यवाद महान काम माँ ' –