कैसे ढाल के साथ स्रोत जार बनाने के लिए


155

मैं एक ओपन सोर्स प्रोजेक्ट के साथ काम कर रहा हूं जो कि ग्रेडेल के साथ बनाया गया है। मैं एक (परियोजना) -source.jar फ़ाइल उत्पन्न करना चाहूंगा जिसे मैं अपनी आईडीई (IntelliJ IDEA) में लोड कर सकता हूं और परियोजना के माध्यम से डिबग कर सकता हूं। मुझे पता है कि अगर मैं इसे जेनरेट कर सकता हूं तो फाइल को कैसे लोड करना है।

मैंने इस परियोजना के लिए उपलब्ध ग्रेडिंग कार्यों को देखा है और कोई ऐसा नहीं है जो एक स्रोत जार फ़ाइल उत्पन्न करता है।

इस परियोजना के लिए एक स्रोत जार फ़ाइल बनाने का सबसे आसान तरीका क्या है?

स्रोत को जार फ़ाइल में जोड़ना जिसमें संकलित श्रेणी की फाइलें शामिल हैं और साथ ही ठीक भी होंगी।

जवाबों:


242
task sourcesJar(type: Jar, dependsOn: classes) {
    classifier = 'sources'
    from sourceSets.main.allSource
}

task javadocJar(type: Jar, dependsOn: javadoc) {
    classifier = 'javadoc'
    from javadoc.destinationDir
}

artifacts {
    archives sourcesJar
    archives javadocJar
}

4
मैं इस उत्तर को महान बारीकियों और मेरी धारणा के आधार पर स्वीकार कर रहा हूं जो कि ढाल प्लगिन का उपयोग करने वाली ग्रेडल परियोजनाओं पर काम करता है। दुर्भाग्य से, यह मेरे मामले में काम नहीं करता है क्योंकि मैं जिस परियोजना का उपयोग कर रहा हूं वह जावा प्लगइन का उपयोग नहीं करता है। मुझे जो त्रुटि मिलती है वह है "कार्य पर संपत्ति 'सोर्ससेट' नहीं मिल सका: 'sourceJar'।"
पॉल डी। ईडन

यदि यह मायने रखता है, तो संदर्भित परियोजना hsqldb 2.2.8 है।
पॉल डी। ईडन

मेरी स्थिति में, allSource संपत्ति जावा फ़ाइलों उठा नहीं था, मैं उपयोग करने के लिए अपने sourcesJar कार्य बदलना पड़ा: sourceSets.main.java, sourceSets.main.resources से
डौग आयर्स की नियुक्ति

5
अगर मैं गलत नहीं हूँ तो आपको क्लास में निर्भरता विनिर्देशों की आवश्यकता नहीं है। ग्रैडल एक कार्य के लिए इनपुट को देखता है, यह निर्धारित करता है कि वे कहां से आए थे, और स्वचालित रूप से एक निर्भरता बनाता है। उदाहरण के लिए javadocJar javadoc से फाइलें खींचता है, इसलिए ग्रेडले निर्भरता javadoc को स्वचालित रूप से जोड़ देगा।
माइकजैक्स 6r

मैं एंड्रॉइड स्टूडियो में उत्पन्न .jar फ़ाइलों का संदर्भ कैसे दे सकता हूं? मुझे उन्हें कहां रखना है?
JJD

54

यदि आप Android का उपयोग कर रहे हैं:

task sourcesJar(type: Jar) {
    from android.sourceSets.main.java.srcDirs
    classifier = 'sources'
}

task javadoc(type: Javadoc) {
    source = android.sourceSets.main.java.srcDirs
    classpath += project.files(android.getBootClasspath().join(File.pathSeparator))
}

task javadocJar(type: Jar, dependsOn: javadoc) {
    classifier = 'javadoc'
    from javadoc.destinationDir
}

artifacts {
    archives javadocJar
    archives sourcesJar
}

से यहाँ


34

यदि आप सूत्रों को संकलित कक्षाओं JAR फ़ाइल में जोड़ना चाहते हैं , जो आपने भी कहा था कि स्वीकार्य होगा, तो आप आसानी से पर्याप्त कर सकते हैं। बस अपनी बिल्ड फ़ाइल में निम्न जोड़ें। आप देख सकते हैं कि, सिद्धांत रूप में, यह एक अलग जार में स्रोतों को डालने के लिए समाधान की तरह है:

 jar {
     from sourceSets.main.allSource
 }

अंतर यह है कि आप इसे स्रोत जार के बदले "जार" कहकर मुख्य जार फ़ाइल में जोड़ रहे हैं।


एंड्रॉइड के ग्रेडेल सिस्टम में, मुझे यह त्रुटि मिल रही है: "type org.gradle.api.Project के प्रोजेक्ट पर तर्क के लिए विधि जार () नहीं मिल सका है"
iamreptar

@iamreptar आपको शायद इसके बजाय Giordano (अगले उत्तर के लेखक) से पूछना चाहिए। मैं Android डेवलपर नहीं हूं। stackoverflow.com/a/28969412/1480995
माइकल ओरील

31

ग्रैडल 6.0 के रूप में समाधान

मान लें कि आप ग्रेड 6.0 के साथ या बाद में java/ java-libraryप्लगइन का उपयोग करते हैं , तो आप sourcesJarनिम्न कॉन्फ़िगरेशन का उपयोग करके एक कार्य प्राप्त कर सकते हैं :

java {
    withSourcesJar()
    // and/or analogously use “withJavadocJar()” to get a “javadocJar” task
}

यदि आप इसके अलावा maven-publish/ ivy-publishप्लगइन (आजकल अनुशंसित) का उपयोग करते हैं , तो यह *-sources.jarआपके मुख्य जावा प्रकाशन के साथ एक कलाकृति भी प्रकाशित करेगा ।

ग्रेडेल डॉक्स भी देखें ।


10

यह काम करना चाहिए

assemble.dependsOn 'propertyJar'

task propertyJar(type: Jar) {
 archiveName = "myJarName.jar"
 from('src/main/resources') {
    include '**'
 }}

1
^ इस assemble.dependsOnभाग के लिए, जो इस कार्य को स्वचालित रूप से चलाता है।
जारेकजेक

3

Kotlin DSL समतुल्य होगा:

tasks {

    val sourcesJar by creating(Jar::class) {
        dependsOn(JavaPlugin.CLASSES_TASK_NAME)
        classifier = "sources"
        from(java.sourceSets["main"].allSource)
    }

    val javadocJar by creating(Jar::class) {
        dependsOn(JavaPlugin.JAVADOC_TASK_NAME)
        classifier = "javadoc"
        from(java.docsDir)
    }

    artifacts {
        add("archives", sourcesJar)
        add("archives", javadocJar)
    }
}

Gradle 5.0 के तहत मेरे लिए काम नहीं: Project."java"पर ले कर जाता JavaPluginExtensionहै जो किसी भी प्रदान नहीं करता है sourceSetsया docsDirगुण।
बेंटोलर

उपयोग करने का प्रयासfrom(sourceSets["main"].allJava)
madhead

परिवर्तित from(javadoc)औरfrom(sourceSets["main"].allSource)
जियोवानी सिल्वा

इसके अलावा कोटलिन डीएसएल के लिए कृपया उत्तर पर एक नज़र डालें: stackoverflow.com/a/60068986/2627884
amatkivskiy

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.