如何使用gradle kotlin脚本创建胖罐

时间:2017-01-22 18:56:10

标签: kotlin build.gradle gradle-kotlin-dsl build.gradle.kts

正如标题所述,我想知道如何修改gradle.build.kts,以便创建一个包含所有依赖项(包括kotlin lib)的唯一jar的任务。 / p>

我在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") {

}

3 个答案:

答案 0 :(得分:22)

这是一个不使用插件的版本,更像是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)
    }
}

Also explained here

一些评论者指出,对于较新的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)中的差异。

答案 1 :(得分:4)

您可以使用ShadowJar plugin构建一个胖罐:

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.0(最新截至2017年2月13日)。

答案 2 :(得分:3)

从Gradle 6.5.1(Kotlin / Kotlin-多平台1.3.72)开始,这里是如何使用build.gradle.kts文件而不使用额外的插件(对于多平台来说确实是不必要的且有问题的)的方法;

注意:实际上,据我所知,很少有插件能够与多平台插件配合使用,这就是为什么我怀疑其设计理念本身如此冗长。它实际上是相当不错的恕我直言,但不够灵活或没有足够的文档记录,因此即使没有其他插件也要花费大量的尝试和错误。

希望这对其他人有帮助。

kotlin {
    jvm {
        compilations {
            val main = getByName("main")
            tasks {
                register<Jar>("fatJar") {
                    group = "application"
                    manifest {
                        attributes["Implementation-Title"] = "Gradle Jar File Example"
                        attributes["Implementation-Version"] = archiveVersion
                        attributes["Main-Class"] = "[[mainClassPath]]"
                    }
                    archiveBaseName.set("${project.name}-fat")
                    from(main.output.classesDirs, main.compileDependencyFiles)
                    with(jar.get() as CopySpec)
                }
            }
        }
    }
}