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.

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
}

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


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.


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 .


10

Esto debería funcionar

assemble.dependsOn 'propertyJar'

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

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

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

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.