Come costruire fonti jar con Gradle


155

Sto lavorando con un progetto open source costruito con Gradle. Vorrei generare un file (project) -sources.jar che posso caricare nel mio IDE (IntelliJ IDEA) ed eseguire il debug attraverso il progetto. So come caricare il file se posso generarlo.

Ho esaminato le attività gradle disponibili per il progetto e non ce n'è una che genera un file jar di fonti.

Qual è il modo più semplice per generare un file jar di origini per questo progetto?

Anche l'aggiunta dell'origine nel file jar che contiene i file di classe compilati andrebbe bene.

Risposte:


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
Sto accettando questa risposta sulla base delle grandi specifiche e il mio presupposto funziona su progetti graduali che utilizzano il plugin Java. Sfortunatamente, nel mio caso non funziona in quanto il progetto che sto usando non usa il plugin java. L'errore che ottengo è "Impossibile trovare la proprietà 'sourceSets' sull'attività ': sourcesJar'."
Paul D. Eden,

In caso di importanza, il progetto indicato è hsqldb 2.2.8.
Paul D. Eden,

Nella mia situazione, la proprietà allSource non stava raccogliendo i file .java, dovevo cambiare il mio compito sourcesJar da usare: da sourceSets.main.java, sourceSets.main.resources
Doug Ayers,

5
Se non sbaglio, anche tu non hai bisogno delle specifiche dependOn nella classe. Gradle esamina gli input per un'attività, determina da dove provengono e crea automaticamente una dipendenza. ad es. javadocJar estrae i file da javadoc, quindi Gradle aggiungerà automaticamente il dipendente su javadoc.
Mikezx6r,

Come posso fare riferimento ai file .jar generati in Android Studio? Dove devo metterli?
JJD

54

Se stai usando Android:

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
}

da qui


34

Se desideri aggiungere i sorgenti al file JAR delle classi compilate , che hai anche detto accettabile, puoi farlo abbastanza facilmente. Aggiungi semplicemente quanto segue al tuo file di build. Puoi vedere che, in teoria, è abbastanza come la soluzione per mettere le fonti in un JAR separato:

 jar {
     from sourceSets.main.allSource
 }

La differenza è che lo stai aggiungendo al file JAR principale dicendo "jar" al posto di sourcesJar.


Nel sistema gradle di Android, visualizzo questo errore: "Impossibile trovare il metodo jar () per argomenti sul progetto di tipo org.gradle.api.Project"
iamreptar,

@iamreptar Probabilmente dovresti chiederlo a Giordano (autore della prossima risposta). Non sono uno sviluppatore Android. stackoverflow.com/a/28969412/1480995
Michael Oryl

31

Soluzione a partire dal Grado 6.0

Supponendo che tu usi il plugin java/ java-librarycon Gradle 6.0 o successivo, puoi ottenere sourcesJarun'attività usando la seguente configurazione:

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

Se usi anche il plugin maven-publish/ ivy-publish(consigliato al giorno d'oggi), questo pubblicherà anche un *-sources.jarartefatto insieme alla tua pubblicazione Java principale.

Vedi anche i documenti Gradle .


10

questo dovrebbe funzionare

assemble.dependsOn 'propertyJar'

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

1
^ per questa assemble.dependsOnparte, che consente di eseguire automaticamente questa attività.
Jarekczek,

3

L'equivalente DSL di Kotlin sarebbe:

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

Non funziona per me sotto Gradle 5.0: Project."java"si risolve a JavaPluginExtensionche non offre alcuna sourceSetso di docsDirproprietà.
bentolor,

Prova a usarefrom(sourceSets["main"].allJava)
madhead il

cambiato from(javadoc)efrom(sourceSets["main"].allSource)
Giovanni Silva

Anche per via DSL Kotlin prega di dare un'occhiata alla risposta: stackoverflow.com/a/60068986/2627884
amatkivskiy

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.