如何使用 gradle kotlin dsl 为简单的控制台应用程序生成 'fatjar'

how to produce a 'fatjar' for a simple console application with gradle kotlin dsl

我有一个简单的应用程序...但考虑到即使 "hello world" 也可以作为示例。我正在使用 gradle kotlin dsl 构建。

我已经应用了应用程序插件,并设置了 mainClassName,但是我得到的唯一 jar(在 /build/libs 中)不包含库,所以不能简单地 运行 和 "java filename" .事实上,出于某种原因我还需要给它一个主要的class。

但我真正的问题是,"what is what easiest way to produce the jar with libraries(fat jar) as an artifact?"

我原以为应用程序插件会有一个选项?

正如@hotkey 指出的那样,您可以像这样使用 https://github.com/johnrengelman/shadow 插件:

在您的依赖项和以下内容中:

classpath 'com.github.jengelman.gradle.plugins:shadow:<version>'

用当前版本替换<version>

并应用插件:

apply plugin: 'com.github.johnrengelman.shadow'

然后你就可以使用shadowJar任务了。

使用 Gradle Kotlin DSL 有两种选择:

  1. 建立你自己的任务。 Gradle documentation

    中给出了一个例子
    tasks.register<Jar>("uberJar") {
        appendix = "uber"
    
        from(sourceSets.main.get().output)
    
        dependsOn(configurations.runtimeClasspath)
        from({
            configurations.runtimeClasspath.get().filter { it.name.endsWith("jar")}.map { zipTree(it) }
        })
    }
    
  2. 使用shadow plugin

    plugins {
        id("com.github.johnrengelman.shadow") version "4.0.4"
    }
    

    它将添加 shadowJar 任务,可以这样调用:gradle build shadowJargradle build shadowJar -x test 跳过测试

    经常需要包含日志记录,可以这样做:

    import com.github.jengelman.gradle.plugins.shadow.tasks.ShadowJar
    import com.github.jengelman.gradle.plugins.shadow.transformers.Log4j2PluginsCacheFileTransformer
    
    tasks.withType<ShadowJar> {
        // the name of the file will be comprised of the basename and version, e.g. $baseName-$version.jar
        baseName = "shadow"
        transform(Log4j2PluginsCacheFileTransformer::class.java)
    }