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.

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
}

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


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.


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 .


11

cela devrait fonctionner

assemble.dependsOn 'propertyJar'

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

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

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

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.