Cómo construir fuentes jar con gradle

155

Estoy trabajando con un proyecto de código abierto que se construye con gradle. Me gustaría generar un archivo (project) -sources.jar que pueda cargar en mi IDE (IntelliJ IDEA) y depurar a través del proyecto. Sé cómo cargar el archivo si puedo generarlo.

He revisado las tareas de gradle disponibles para el proyecto y no hay una que genere un archivo jar de fuentes.

¿Cuál es la forma más fácil de generar un archivo jar de fuentes para este proyecto?

Agregar la fuente en el archivo jar que contiene los archivos de clase compilados también estaría bien.

Paul D. Eden
fuente

Respuestas:

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
fuente
44
Estoy aceptando esta respuesta basada en los excelentes detalles y mi suposición de que funciona en proyectos de Gradle que usan el complemento de Java. Desafortunadamente, no funciona en mi caso ya que el proyecto que estoy usando no usa el complemento de Java. El error que obtengo es "No se pudo encontrar la propiedad 'sourceSets' en la tarea ': sourcesJar'".
Paul D. Eden
En caso de que sea importante, el proyecto mencionado es hsqldb 2.2.8.
Paul D. Eden
En mi situación, la propiedad allSource no estaba recogiendo los archivos .java, tuve que cambiar mi tarea de fuentesJar para usar: de sourceSets.main.java, sourceSets.main.resources
Doug Ayers
55
Si no me equivoco, tampoco necesita las especificaciones dependientes de la clase. Gradle analiza las entradas para una tarea, determina de dónde provienen y crea automáticamente una dependencia. por ejemplo, javadocJar extrae archivos de javadoc, por lo tanto, Gradle agregará la dependencia de javadoc automáticamente.
Mikezx6r
¿Cómo puedo hacer referencia a los archivos .jar generados en Android Studio? ¿Dónde tengo que ponerlos?
JJD
54

Si estás 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
}

desde aqui

Giordano
fuente
34

Si desea agregar las fuentes al archivo JAR de clases compiladas , que también dijo que sería aceptable, puede hacerlo con bastante facilidad. Simplemente agregue lo siguiente a su archivo de compilación. Puede ver que, en teoría, es bastante como la solución para poner las fuentes en un JAR separado:

 jar {
     from sourceSets.main.allSource
 }

La diferencia es que lo está agregando al archivo JAR principal diciendo "jar" en lugar de sourcesJar.

Michael Oryl
fuente
En el sistema Gradle de Android, recibo este error: "No se pudo encontrar el método jar () para argumentos en proyectos de tipo org.gradle.api.Project"
iamreptar
@iamreptar Probablemente deberías preguntarle a Giordano (autor de la siguiente respuesta) sobre eso. No soy un desarrollador de Android. stackoverflow.com/a/28969412/1480995
Michael Oryl
31

Solución a partir de Gradle 6.0

Suponiendo que usa el complemento java/ java-librarycon Gradle 6.0 o posterior, puede obtener una sourcesJartarea usando la siguiente configuración:

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

Si además usa el complemento maven-publish/ ivy-publish(recomendado hoy en día), esto también publicará un *-sources.jarartefacto junto con su publicación principal de Java.

Ver también los documentos de Gradle .

Chriki
fuente
10

Esto debería funcionar

assemble.dependsOn 'propertyJar'

task propertyJar(type: Jar) {
 archiveName = "myJarName.jar"
 from('src/main/resources') {
    include '**'
 }}
Ali
fuente
1
^ para esta assemble.dependsOnparte, que hace que esta tarea se ejecute automáticamente.
Jarekczek
3

El equivalente de Kotlin DSL sería:

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
fuente
No funciona para mí en Gradle 5.0: Project."java"resuelve JavaPluginExtensionlo que no ofrece ninguna sourceSetso docsDirpropiedades.
bentolor
Intente usarfrom(sourceSets["main"].allJava)
madhead
cambiado from(javadoc)yfrom(sourceSets["main"].allSource)
Giovanni Silva
También para kotlin DSL way, eche un vistazo a la respuesta: stackoverflow.com/a/60068986/2627884
amatkivskiy