Wie man Quellenglas mit Gradle baut


155

Ich arbeite mit einem Open-Source-Projekt, das mit gradle erstellt wurde. Ich möchte eine (Projekt-) -sources.jar-Datei generieren, die ich in meine IDE (IntelliJ IDEA) laden und über das Projekt debuggen kann. Ich kann die Datei laden, wenn ich sie generieren kann.

Ich habe die verfügbaren Gradle-Aufgaben für das Projekt durchgesehen und es gibt keine, die eine Quell-JAR-Datei generiert.

Was ist der einfachste Weg, um eine Quell-JAR-Datei für dieses Projekt zu generieren?

Das Hinzufügen der Quelle zu der JAR-Datei, die die kompilierten Klassendateien enthält, ist ebenfalls in Ordnung.

Antworten:


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
Ich akzeptiere diese Antwort aufgrund der großen Besonderheiten und meiner Annahme, dass sie bei Gradle-Projekten funktioniert, die das Java-Plugin verwenden. Leider funktioniert es in meinem Fall nicht, da das von mir verwendete Projekt das Java-Plugin nicht verwendet. Der Fehler, den ich erhalte, lautet "Die Eigenschaft 'sourceSets' für Aufgabe ': sourcesJar' konnte nicht gefunden werden."
Paul D. Eden

Falls es darauf ankommt, ist das Projekt, auf das Bezug genommen wird, hsqldb 2.2.8.
Paul D. Eden

In meiner Situation nahm die allSource-Eigenschaft die .java-Dateien nicht auf, ich musste meine sourceJar-Aufgabe ändern, um sie zu verwenden: von sourceSets.main.java, sourceSets.main.resources
Doug Ayers

5
Wenn ich mich nicht irre, brauchen Sie auch nicht die abhängigen Spezifikationen in der Klasse. Gradle überprüft die Eingaben für eine Aufgabe, ermittelt, woher sie stammen, und erstellt automatisch eine Abhängigkeit. Beispiel: javadocJar ruft Dateien aus javadoc ab, daher fügt Gradle automatisch das abhängige Javadoc hinzu.
Mikezx6r

Wie kann ich auf die generierten JAR-Dateien in Android Studio verweisen? Wo muss ich sie hinstellen?
JJD

54

Wenn Sie Android verwenden:

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
}

von hier


34

Wenn Sie die Quellen zur JAR-Datei für kompilierte Klassen hinzufügen möchten , von der Sie auch sagten, dass sie akzeptabel wäre, können Sie dies problemlos tun. Fügen Sie Ihrer Build-Datei einfach Folgendes hinzu. Sie können sehen, dass es theoretisch der Lösung ähnelt, Quellen in ein separates JAR zu stellen:

 jar {
     from sourceSets.main.allSource
 }

Der Unterschied besteht darin, dass Sie es zur Haupt-JAR-Datei hinzufügen, indem Sie "jar" anstelle von sourceJar sagen.


Im Gradle-System von Android wird folgende Fehlermeldung angezeigt: "Die Methode jar () für Argumente für ein Projekt vom Typ org.gradle.api.Project konnte nicht gefunden werden"
iamreptar

@iamreptar Du solltest stattdessen wahrscheinlich Giordano (Autor der nächsten Antwort) danach fragen. Ich bin kein Android-Entwickler. stackoverflow.com/a/28969412/1480995
Michael Oryl

31

Lösung ab Gradle 6.0

Angenommen, Sie verwenden das Plugin java/ java-librarymit Gradle 6.0 oder höher, können Sie eine sourcesJarAufgabe mit der folgenden Konfiguration erhalten:

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

Wenn Sie zusätzlich das Plugin maven-publish/ verwenden ivy-publish(heutzutage empfohlen), wird dadurch auch ein *-sources.jarArtefakt zusammen mit Ihrer Haupt-Java-Publikation veröffentlicht.

Siehe auch die Gradle-Dokumente .


10

das sollte funktionieren

assemble.dependsOn 'propertyJar'

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

1
^ für diesen assemble.dependsOnTeil, wodurch diese Aufgabe automatisch ausgeführt wird.
Jarekczek

3

Das Kotlin DSL-Äquivalent wäre:

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

Funktioniert nicht für mich unter Gradle 5.0: Project."java"Auflösungen, für JavaPluginExtensiondie keine sourceSetsoder docsDirEigenschaften angeboten werden.
Bentolor

Versuchen Sie es mitfrom(sourceSets["main"].allJava)
Madhead

geändert from(javadoc)undfrom(sourceSets["main"].allSource)
Giovanni Silva

Auch für kotlin DSL Weg schauen Sie bitte auf Antwort: stackoverflow.com/a/60068986/2627884
amatkivskiy

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.