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.

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
}

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


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.


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 .


10

ini seharusnya bekerja

assemble.dependsOn 'propertyJar'

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

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)
    }
}

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

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.