web-dev-qa-db-ja.com

Gradle Kotlinスクリプトでファットジャーを作成する方法

タイトルどおり、すべての依存関係(kotlin libを含む)を含む一意のjarを作成するタスクを作成するために、gradle.build.ktsを変更する方法を知りたいです。

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
}

しかし、私はkotlinでそれをどのように書くことができるのか分かりません:

task("fatJar") {

}
25
elect

これは、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)
    }
}
_

ここでも説明


一部のコメント者は、これは新しいGradleバージョンではもう機能しないと指摘しました。 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)
    }
}
_

configurations.runtimeClasspath.get()with(tasks.jar.get() as CopySpec)の違いに注意してください。

22

ShadowJarプラグイン を使用して、ファットjarを作成できます。

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

「shadowJar」でタスクを実行するだけです。

注:これは、 GSK 0.7. (2017年2月13日現在)を使用していることを前提としています。

4
mbStavola