วิธีสร้างโอ่งแหล่งข้อมูลด้วย gradle


155

ฉันกำลังทำงานกับโครงการโอเพนซอร์สที่สร้างขึ้นด้วยการไล่ระดับสี ฉันต้องการสร้างไฟล์ (โครงการ) -sources.jar ที่ฉันสามารถโหลดลงใน IDE ของฉัน (IntelliJ IDEA) และตรวจแก้จุดบกพร่องผ่านโครงการ ฉันรู้วิธีโหลดไฟล์ถ้าฉันสามารถสร้างมันได้

ฉันได้ดูงานการไล่ระดับสีที่มีสำหรับโครงการและไม่มีงานที่สร้างไฟล์ jar ต้นฉบับ

วิธีที่ง่ายที่สุดในการสร้างไฟล์ jar ต้นฉบับสำหรับโครงการนี้คืออะไร?

การเพิ่มแหล่งที่มาลงในไฟล์ jar ที่มีไฟล์คลาสที่คอมไพล์แล้วก็น่าจะดีเช่นกัน

คำตอบ:


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
ฉันยอมรับคำตอบนี้โดยยึดตามรายละเอียดที่ดีเยี่ยมและข้อสันนิษฐานของฉันจะใช้กับโปรเจ็กต์ gradle ที่ใช้โปรแกรมเสริมจาวา น่าเสียดายที่มันไม่ทำงานในกรณีของฉันเนื่องจากโครงการที่ฉันใช้ไม่ได้ใช้ปลั๊กอิน java ข้อผิดพลาดที่ฉันได้รับคือ "ไม่พบคุณสมบัติ 'sourceSets' ในงาน ': sourcesJar'"
Paul D. Eden

ในกรณีที่มีความสำคัญโครงการที่อ้างถึงคือ hsqldb 2.2.8
Paul D. Eden

ในสถานการณ์ของฉันคุณสมบัติ allSource ไม่ได้รับไฟล์. java ฉันต้องเปลี่ยนงาน sourceJar ที่จะใช้: จาก sourceSets.main.java, sourceSets.main.resources
Doug Ayers

5
ถ้าฉันไม่เข้าใจผิดคุณก็ไม่จำเป็นต้องพึ่งข้อกำหนดเฉพาะในชั้นเรียนด้วย Gradle ดูที่อินพุตสำหรับงานกำหนดว่ามาจากไหนและสร้างการพึ่งพาโดยอัตโนมัติ เช่น javadocJar ดึงไฟล์จาก javadoc ดังนั้น Gradle จะเพิ่มการพึ่งพา javadoc โดยอัตโนมัติ
Mikezx6r

ฉันจะอ้างอิงไฟล์. jar ที่สร้างใน Android Studio ได้อย่างไร ฉันจะต้องใส่พวกเขาที่ไหน
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 แยกต่างหาก:

 jar {
     from sourceSets.main.allSource
 }

ความแตกต่างคือคุณกำลังเพิ่มไฟล์ลงในไฟล์ JAR หลักโดยพูดว่า "jar" แทนแหล่งที่มา JAR


ในระบบการไล่ระดับสีของ Android ฉันได้รับข้อผิดพลาดนี้: "ไม่พบเมธอด jar () สำหรับข้อโต้แย้งในโครงการประเภท org.gradle.api.Project"
iamreptar

@iamreptar คุณควรถาม Giordano (ผู้เขียนคำตอบถัดไป) เกี่ยวกับสิ่งนั้นแทน ฉันไม่ใช่นักพัฒนา Android stackoverflow.com/a/28969412/1480995
Michael Oryl

31

การแก้ปัญหา ณ Gradle 6.0

สมมติว่าคุณใช้java/ java-libraryplugin ด้วย Gradle 6.0 หรือใหม่กว่าคุณสามารถรับsourcesJarงานโดยใช้การกำหนดค่าต่อไปนี้:

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

หากคุณใช้maven-publish/ ivy-publishปลั๊กอินเพิ่มเติม (แนะนำทุกวันนี้) สิ่งนี้จะเผยแพร่ a*-sources.jarสิ่งประดิษฐ์พร้อมกับสิ่งพิมพ์ Java หลักของคุณ

ดูเพิ่มเติมเอกสาร Gradle


10

สิ่งนี้น่าจะใช้ได้

assemble.dependsOn 'propertyJar'

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

1
^ สำหรับassemble.dependsOnส่วนนี้ซึ่งทำให้งานนี้ทำงานโดยอัตโนมัติ
Jarekczek

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คุณสมบัติใด ๆ
bentolor

ลองใช้from(sourceSets["main"].allJava)
madhead

เปลี่ยนfrom(javadoc)และfrom(sourceSets["main"].allSource)
Giovanni Silva

นอกจากนี้สำหรับ kotlin DSL ด้วยโปรดดูคำตอบ: stackoverflow.com/a/60068986/2627884
amatkivskiy

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.