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.

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
}

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


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.


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 .


10

to powinno działać

assemble.dependsOn 'propertyJar'

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

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

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

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.