Comment créer un pot de sources avec Gradle

155

Je travaille avec un projet open source construit avec gradle. Je voudrais générer un fichier (projet) -sources.jar que je peux charger dans mon IDE (IntelliJ IDEA) et déboguer via le projet. Je sais comment charger le fichier si je peux le générer.

J'ai regardé à travers les tâches de gradle disponibles pour le projet et il n'y en a pas une qui génère un fichier jar sources.

Quelle est la manière la plus simple de générer un fichier jar sources pour ce projet?

L'ajout de la source dans le fichier jar contenant les fichiers de classe compilés serait également très bien.

Paul D. Eden
la source

Réponses:

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
la source
4
J'accepte cette réponse en fonction des grandes spécificités et de mon hypothèse que cela fonctionne sur les projets gradle qui utilisent le plugin java. Malheureusement, cela ne fonctionne pas dans mon cas car le projet que j'utilise n'utilise pas le plugin java. L'erreur que j'obtiens est "Impossible de trouver la propriété 'sourceSets' sur la tâche ': sourcesJar'."
Paul
Au cas où cela importerait, le projet auquel il est fait référence est hsqldb 2.2.8.
Paul
Dans ma situation, la propriété allSource ne récupérait pas les fichiers .java, j'ai dû changer ma tâche sourcesJar pour utiliser: de sourceSets.main.java, sourceSets.main.resources
Doug Ayers
5
Si je ne me trompe pas, vous n'avez pas non plus besoin des spécifications dependOn dans la classe. Gradle examine les entrées d'une tâche, détermine d'où elles proviennent et crée automatiquement une dépendance. par exemple, javadocJar extrait les fichiers de javadoc, donc Gradle ajoutera automatiquement le javadoc dependOn.
Mikezx6r
Comment puis-je référencer les fichiers .jar générés dans Android Studio? Où dois-je les mettre?
JJD
54

Si vous utilisez 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
}

d' ici

Giordano
la source
34

Si vous souhaitez ajouter les sources au fichier JAR des classes compilées , ce que vous avez également dit serait acceptable, vous pouvez le faire assez facilement. Ajoutez simplement ce qui suit à votre fichier de construction. Vous pouvez voir que, en théorie, c'est tout à fait comme la solution pour mettre des sources dans un JAR séparé:

 jar {
     from sourceSets.main.allSource
 }

La différence est que vous l'ajoutez au fichier JAR principal en disant "jar" au lieu de sourcesJar.

Michael Oryl
la source
Dans le système gradle d'Android, j'obtiens cette erreur: "Impossible de trouver la méthode jar () pour les arguments sur le projet de type org.gradle.api.Project"
iamreptar
@iamreptar Vous devriez probablement demander à Giordano (auteur de la prochaine réponse) à ce sujet à la place. Je ne suis pas un développeur Android. stackoverflow.com/a/28969412/1480995
Michael Oryl
31

Solution à partir de Gradle 6.0

En supposant que vous utilisez le plugin java/ java-libraryavec Gradle 6.0 ou version ultérieure, vous pouvez obtenir une sourcesJartâche en utilisant la configuration suivante:

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

Si vous utilisez en plus le plugin maven-publish/ ivy-publish(recommandé de nos jours), cela publiera également un*-sources.jar artefact avec votre publication Java principale.

Voir aussi la documentation Gradle .

Chriki
la source
11

cela devrait fonctionner

assemble.dependsOn 'propertyJar'

task propertyJar(type: Jar) {
 archiveName = "myJarName.jar"
 from('src/main/resources') {
    include '**'
 }}
Ali
la source
1
^ pour cette assemble.dependsOnpartie, ce qui rend cette tâche exécutée automatiquement.
Jarekczek
3

L'équivalent DSL Kotlin serait:

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
la source
Ne fonctionne pas pour moi sous Gradle 5.0: Project."java"résout JavaPluginExtensionce qui n'offre aucune propriété sourceSetsou docsDir.
bentolor
Essayez d'utiliserfrom(sourceSets["main"].allJava)
madhead
changé from(javadoc)etfrom(sourceSets["main"].allSource)
Giovanni Silva
Aussi pour kotlin DSL way, veuillez consulter la réponse: stackoverflow.com/a/60068986/2627884
amatkivskiy