Cara membangun sumber jar dengan gradle

155

Saya bekerja dengan proyek open source yang dibangun dengan gradle. Saya ingin menghasilkan file (proyek) -sources.jar yang dapat saya muat ke IDE (IntelliJ IDEA) saya dan debug melalui proyek. Saya tahu cara memuat file jika saya bisa membuatnya.

Saya telah melihat melalui tugas gradle yang tersedia untuk proyek dan tidak ada yang menghasilkan file sumber jar.

Apa cara termudah untuk menghasilkan file jar sumber untuk proyek ini?

Menambahkan sumber ke file jar yang berisi file kelas yang dikompilasi juga akan baik-baik saja.

Paul D. Eden
sumber

Jawaban:

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
}
JB Nizet
sumber
4
Saya menerima jawaban ini berdasarkan spesifik yang bagus dan asumsi saya ini berfungsi pada proyek gradle yang menggunakan plugin java. Sayangnya, itu tidak berfungsi dalam kasus saya karena proyek yang saya gunakan tidak menggunakan plugin java. Kesalahan yang saya dapatkan adalah "Tidak dapat menemukan properti 'sourceSet' pada tugas ': sourcesJar'."
Paul D. Eden
Dalam hal ini penting, proyek yang dimaksud adalah hsqldb 2.2.8.
Paul D. Eden
Dalam situasi saya, properti allSource tidak mengambil file .java, saya harus mengubah tugas sumber saya untuk menggunakan: dari sourceSets.main.java, sourceSets.main.resources
Doug Ayers
5
Jika saya tidak salah, Anda juga tidak memerlukan spesifikasi dependOn di kelas. Gradle melihat input untuk suatu tugas, menentukan dari mana asalnya, dan secara otomatis membuat ketergantungan. misalnya javadocJar menarik file dari javadoc, oleh karena itu Gradle akan menambahkan javadoc dependOn secara otomatis.
Mikezx6r
Bagaimana saya bisa mereferensikan file .jar yang dihasilkan di Android Studio? Di mana saya harus meletakkannya?
JJD
54

Jika Anda menggunakan 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
}

dari sini

Giordano
sumber
34

Jika Anda ingin menambahkan sumber ke file JAR kelas yang dikompilasi , yang juga Anda katakan dapat diterima, Anda dapat melakukannya dengan cukup mudah. Cukup tambahkan berikut ini ke file build Anda. Anda dapat melihat bahwa, secara teori, ini cukup seperti solusi untuk menempatkan sumber ke dalam JAR terpisah:

 jar {
     from sourceSets.main.allSource
 }

Perbedaannya adalah bahwa Anda menambahkannya ke file JAR utama dengan mengatakan "toples" sebagai ganti dari sourcesJar.

Michael Oryl
sumber
Dalam sistem gradle Android, saya mendapatkan kesalahan ini: "Tidak dapat menemukan metode jar () untuk argumen tentang proyek tipe org.gradle.api.Project"
iamreptar
@iamreptar Anda mungkin harus bertanya kepada Giordano (penulis jawaban berikutnya) tentang itu. Saya bukan pengembang Android. stackoverflow.com/a/28969412/1480995
Michael Oryl
31

Solusi pada Gradle 6.0

Dengan asumsi bahwa Anda menggunakan java/ java-libraryplugin dengan Gradle 6.0 atau yang lebih baru, Anda bisa mendapatkan sourcesJartugas menggunakan konfigurasi berikut:

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

Jika Anda juga menggunakan maven-publish/ ivy-publishplugin (disarankan saat ini), maka ini juga akan menerbitkan *-sources.jarartefak bersama dengan publikasi Java utama Anda.

Lihat juga dokumen Gradle .

Chriki
sumber
10

ini seharusnya bekerja

assemble.dependsOn 'propertyJar'

task propertyJar(type: Jar) {
 archiveName = "myJarName.jar"
 from('src/main/resources') {
    include '**'
 }}
Ali
sumber
1
^ untuk assemble.dependsOnbagian ini , yang membuat tugas ini berjalan secara otomatis.
Jarekczek
3

Setara DSL Kotlin adalah:

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)
    }
}
Wheleph
sumber
Tidak bekerja untuk saya di bawah Gradle 5.0: Project."java"resolve ke JavaPluginExtensionyang tidak menawarkan sourceSetsatau docsDirproperti.
bentolor
Coba gunakanfrom(sourceSets["main"].allJava)
madhead
berubah from(javadoc)danfrom(sourceSets["main"].allSource)
Giovanni Silva
Juga untuk cara DSL kotlin, silakan lihat jawabannya: stackoverflow.com/a/60068986/2627884
amatkivskiy