web-dev-qa-db-fra.com

Comment créer le gros pot avec le script Gradle Kotlin

Comme intitulé, je voudrais savoir comment modifier le gradle.build.kts afin d'avoir une tâche pour créer un jar unique avec toutes les dépendances (kotlin lib inclus) à l'intérieur.

J'ai trouvé cet exemple dans Groovy:

//create a single Jar with all dependencies
task fatJar(type: Jar) {
    manifest {
        attributes 'Implementation-Title': 'Gradle Jar File Example',
            'Implementation-Version': version,
            'Main-Class': 'com.mkyong.DateUtils'
    }
    baseName = project.name + '-all'
    from { configurations.compile.collect { it.isDirectory() ? it : zipTree(it) } }
    with jar
}

Mais je n'ai aucune idée de comment écrire cela en kotlin, à part:

task("fatJar") {

}
25
elect

Voici une version qui n'utilise pas de plugin, plus comme la version Groovy.

import org.gradle.jvm.tasks.Jar

val fatJar = task("fatJar", type = Jar::class) {
    baseName = "${project.name}-fat"
    manifest {
        attributes["Implementation-Title"] = "Gradle Jar File Example"
        attributes["Implementation-Version"] = version
        attributes["Main-Class"] = "com.mkyong.DateUtils"
    }
    from(configurations.runtime.map({ if (it.isDirectory) it else zipTree(it) }))
    with(tasks["jar"] as CopySpec)
}

tasks {
    "build" {
        dependsOn(fatJar)
    }
}

Également expliqué ici


Certains commentateurs ont souligné que cela ne fonctionne plus avec les nouvelles versions de Gradle. Mise à jour testée avec Gradle 5.4.1:

import org.gradle.jvm.tasks.Jar

val fatJar = task("fatJar", type = Jar::class) {
    baseName = "${project.name}-fat"
    manifest {
        attributes["Implementation-Title"] = "Gradle Jar File Example"
        attributes["Implementation-Version"] = version
        attributes["Main-Class"] = "com.mkyong.DateUtils"
    }
    from(configurations.runtimeClasspath.get().map({ if (it.isDirectory) it else zipTree(it) }))
    with(tasks.jar.get() as CopySpec)
}

tasks {
    "build" {
        dependsOn(fatJar)
    }
}

Notez la différence entre configurations.runtimeClasspath.get() et with(tasks.jar.get() as CopySpec).

22

Vous pouvez utiliser le plugin ShadowJar pour construire un gros pot:

import com.github.jengelman.gradle.plugins.shadow.tasks.ShadowJar

buildscript {
    repositories {
        mavenCentral()
        gradleScriptKotlin()
    }
    dependencies {
        classpath(kotlinModule("gradle-plugin"))
        classpath("com.github.jengelman.gradle.plugins:shadow:1.2.3")
    }
}

apply {
    plugin("kotlin")
    plugin("com.github.johnrengelman.shadow")
}

repositories {
    mavenCentral()
}

val shadowJar: ShadowJar by tasks
shadowJar.apply {
    manifest.attributes.apply {
        put("Implementation-Title", "Gradle Jar File Example")
        put("Implementation-Version" version)
        put("Main-Class", "com.mkyong.DateUtils")
    }

    baseName = project.name + "-all"
}

Exécutez simplement la tâche avec 'shadowJar'.

REMARQUE: cela suppose que vous utilisez GSK 0.7. (au plus tard le 13/02/2017).

4
mbStavola