Gradle ile Kaynak Kavanozu Nasıl Yapılır


155

Gradle ile inşa edilmiş açık kaynaklı bir proje ile çalışıyorum. IDE (IntelliJ IDEA) içine yükleyebilir ve proje boyunca hata ayıklamak bir (project) -sources.jar dosyası oluşturmak istiyorum. Dosyayı oluşturabilirsem dosyayı nasıl yükleyeceğimi biliyorum.

Proje için kullanılabilir gradle görevleri inceledim ve bir kaynak jar dosyası üreten biri yok.

Bu proje için bir kaynak jar dosyası oluşturmanın en kolay yolu nedir?

Derlenmiş sınıf dosyalarını içeren jar dosyasına kaynak eklemek de iyi olur.

Yanıtlar:


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
Bu cevabı harika özelliklere ve java eklentisini kullanan gradle projelerinde çalıştığı varsayımına dayanarak kabul ediyorum. Ne yazık ki, benim durumumda çalışmıyor çünkü kullandığım proje java eklentisini kullanmıyor. Aldığım hata "görev ':' kaynakSet 'özelliği bulunamadı: sourcesJar'."
Paul D. Eden

Önemli olması halinde, atıfta bulunulan proje hsqldb 2.2.8'dir.
Paul D. Eden

Benim durumumda, allSource özelliği .java dosyalarını almak değildi, ben kullanmak için sourcesJar görev değiştirmek zorunda kaldı: from sourceSets.main.java, sourceSets.main.resources
Doug Ayers

5
Eğer yanılmıyorsam, sınıfta dependsOn özelliklerine de ihtiyacınız yoktur. Gradle bir görevin girdilerine bakar, nereden geldiğini belirler ve otomatik olarak bir bağımlılık oluşturur. örneğin javadocJar, dosyaları javadoc'tan alır, bu nedenle Gradle otomatik olarak dependsOn javadoc'u ekler.
Mikezx6r

Android Studio'da oluşturulan .jar dosyalarına nasıl başvurabilirim? Onları nereye koymam gerekiyor?
JJD

54

Android kullanıyorsanız:

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
}

dan burada


34

Kaynakları derlenebilir sınıflar JAR dosyasına eklemek isterseniz , kabul edilebilir olacağını da söylüyorsunuz, bunu kolayca yapabilirsiniz. Yapım dosyanıza aşağıdakileri eklemeniz yeterlidir. Teoride, kaynakları ayrı bir JAR'a koymak için bir çözüm gibi olduğunu görebilirsiniz:

 jar {
     from sourceSets.main.allSource
 }

Aradaki fark, ana JAR dosyasına, sourcesJar yerine "jar" diyerek eklemenizdir.


Android'in gradle sisteminde şu hatayı alıyorum: "org.gradle.api.Project türündeki projedeki argümanlar için yöntem jar () bulunamadı"
iamreptar

@iamreptar Bunun yerine muhtemelen Giordano'ya (bir sonraki cevabın yazarı) sormalısınız. Ben bir Android geliştiricisi değilim. stackoverflow.com/a/28969412/1480995
Michael Oryl

31

Gradle 6.0'dan itibaren çözüm

java/ java-libraryEklentisini Gradle 6.0 veya daha yeni bir sürümle kullandığınızı varsayarsak sourcesJar, aşağıdaki yapılandırmayı kullanarak bir görev alabilirsiniz :

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

Ek olarak maven-publish/ ivy-publishplugin (bugünlerde önerilir) kullanırsanız, bu da *-sources.jarana Java yayınınızla birlikte bir eser yayınlar.

Ayrıca bkz . Gradle belgeleri .


11

bu çalışmalı

assemble.dependsOn 'propertyJar'

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

1
^ Bu assemble.dependsOnbölüm için bu görevi otomatik olarak çalıştırır.
Jarekczek

3

Kotlin DSL eşdeğeri:

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 altında benim için çalışmıyorum: hangisi veya özelliği sunmadığını Project."java"çözer . JavaPluginExtensionsourceSetsdocsDir
bentolor

Kullanmayı deneyinfrom(sourceSets["main"].allJava)
madhead

değişti from(javadoc)vefrom(sourceSets["main"].allSource)
Giovanni Silva

Ayrıca kotlin DSL yolu için lütfen cevaba bir göz atın: stackoverflow.com/a/60068986/2627884
amatkivskiy

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.