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.

Paul D. Eden
quelle

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
}
JB Nizet
quelle
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

Giordano
quelle
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.

Michael Oryl
quelle
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 .

Chriki
quelle
10

das sollte funktionieren

assemble.dependsOn 'propertyJar'

task propertyJar(type: Jar) {
 archiveName = "myJarName.jar"
 from('src/main/resources') {
    include '**'
 }}
Ali
quelle
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)
    }
}
wheleph
quelle
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