Jak zbudować słoik ze źródłami za pomocą gradle

155

Pracuję z projektem open source, który jest zbudowany z Gradle. Chciałbym wygenerować plik (projekt) -sources.jar, który mogę załadować do mojego IDE (IntelliJ IDEA) i debugować za pośrednictwem projektu. Wiem, jak załadować plik, jeśli mogę go wygenerować.

Przejrzałem dostępne zadania gradle dla projektu i nie ma takiego, który generuje plik jar źródeł.

Jaki jest najłatwiejszy sposób wygenerowania źródłowego pliku jar dla tego projektu?

Dodanie źródła do pliku jar, który zawiera skompilowane pliki klas, również byłoby w porządku.

Paul D. Eden
źródło

Odpowiedzi:

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
źródło
4
Akceptuję tę odpowiedź w oparciu o świetne szczegóły i moje założenie, że działa ona na projektach gradle, które używają wtyczki java. Niestety w moim przypadku to nie działa, ponieważ projekt, którego używam, nie korzysta z wtyczki java. Wyświetlany przeze mnie błąd to „Nie można znaleźć właściwości 'sourceSets' w zadaniu ': sourcesJar'."
Paul D. Eden,
W razie potrzeby projekt, o którym mowa, to hsqldb 2.2.8.
Paul D. Eden,
W mojej sytuacji właściwość allSource nie pobierała plików .java, musiałem zmienić zadanie sourceJar na: z sourceSets.main.java, sourceSets.main.resources
Doug Ayers
5
Jeśli się nie mylę, nie potrzebujesz również specyfikacji dependOn w klasie. Gradle sprawdza dane wejściowe zadania, określa, skąd one pochodzą, i automatycznie tworzy zależność. np. javadocJar pobiera pliki z javadoc, dlatego Gradle automatycznie doda dependOn javadoc.
Mikezx6r
Jak mogę odwołać się do wygenerowanych plików .jar w Android Studio? Gdzie mam je umieścić?
JJD
54

Jeśli używasz Androida:

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
}

od tutaj

Giordano
źródło
34

Jeśli chcesz dodać źródła do skompilowanego pliku JAR klas , co również powiedziałeś, że byłoby do przyjęcia, możesz to zrobić dość łatwo. Po prostu dodaj następujące elementy do pliku kompilacji. Możesz zobaczyć, że w teorii jest to całkiem podobne do rozwiązania polegającego na umieszczeniu źródeł w oddzielnym JAR:

 jar {
     from sourceSets.main.allSource
 }

Różnica polega na tym, że dodajesz go do głównego pliku JAR, mówiąc „jar” zamiast sourcesJar.

Michael Oryl
źródło
W systemie gradle Androida pojawia się ten błąd: „Nie można znaleźć metody jar () dla argumentów w projekcie typu org.gradle.api.Project”
iamreptar
@iamreptar Zamiast tego prawdopodobnie powinieneś zapytać o to Giordano (autora następnej odpowiedzi). Nie jestem programistą Androida. stackoverflow.com/a/28969412/1480995
Michael Oryl
31

Rozwiązanie od Gradle 6.0

Zakładając, że używasz wtyczki java/ java-libraryz Gradle 6.0 lub nowszym, możesz uzyskać sourcesJarzadanie przy użyciu następującej konfiguracji:

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

Jeśli dodatkowo użyjesz wtyczki maven-publish/ ivy-publish(obecnie zalecanej), spowoduje to również opublikowanie *-sources.jarartefaktu wraz z główną publikacją Java.

Zobacz także dokumentację Gradle .

Chriki
źródło
10

to powinno działać

assemble.dependsOn 'propertyJar'

task propertyJar(type: Jar) {
 archiveName = "myJarName.jar"
 from('src/main/resources') {
    include '**'
 }}
Ali
źródło
1
^ w tej assemble.dependsOnczęści, co powoduje, że zadanie jest uruchamiane automatycznie.
Jarekczek
3

Odpowiednik Kotlin DSL wyglądałby następująco:

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
źródło
Nie działa dla mnie pod Gradle 5.0: Project."java"rozwiązuje, JavaPluginExtensionktóre nie oferuje żadnych sourceSetslub docsDirwłaściwości.
bentolor
Spróbuj użyćfrom(sourceSets["main"].allJava)
madhead
zmienił się from(javadoc)ifrom(sourceSets["main"].allSource)
Giovanni Silva
Również w przypadku kotlin DSL, spójrz na odpowiedź: stackoverflow.com/a/60068986/2627884
amatkivskiy