Fat Jar使用Gradle Kotlin DSL扩展依赖项

Fat Jar使用Gradle Kotlin DSL扩展依赖项,gradle,gradle-kotlin-dsl,Gradle,Gradle Kotlin Dsl,我试图在基于Kotlin的gradle文件中使用以下内容构建一个胖jar val fatJar = task("fatJar", type = Jar::class) { baseName = "safescape-lib-${project.name}" // manifest Main-Class attribute is optional. // (Used only to provide default main class for executable jar)

我试图在基于Kotlin的gradle文件中使用以下内容构建一个胖jar

val fatJar = task("fatJar", type = Jar::class) {
    baseName = "safescape-lib-${project.name}"
    // manifest Main-Class attribute is optional.
    // (Used only to provide default main class for executable jar)
    from(configurations.runtimeClasspath.map({ if (it.isDirectory) it else zipTree(it) }))
    with(tasks["jar"] as CopySpec)
}

tasks {
    "build" {
        dependsOn(fatJar)
    }
}
然而,fat jar扩展了所有依赖项。我希望将JAR按原样包含在/lib目录中,但我无法确定如何实现这一点

有谁能给我一些建议,告诉我怎样才能做到这一点


谢谢

您在规范的
map
部分中使用了
zipTree
,它的行为如下:解压非目录的文件

如果要在
/lib
中使用JAR,请将
中的
替换为:

from(configurations.runtimeClasspath) {
    into("lib")
}

如果有人使用的是
kotlin multiplatform
plugin,那么配置就有点不同了。下面是一个
fatJar
任务配置,假设JVM应用程序具有JS模块中的嵌入式JS前端:

afterEvaluate {
  tasks {
    create("jar", Jar::class).apply {
      dependsOn("jvmMainClasses", "jsJar")
      group = "jar"
      manifest {
        attributes(
          mapOf(
            "Implementation-Title" to rootProject.name,
            "Implementation-Version" to rootProject.version,
            "Timestamp" to System.currentTimeMillis(),
            "Main-Class" to mainClassName
          )
        )
      }
      val dependencies = configurations["jvmRuntimeClasspath"].filter { it.name.endsWith(".jar") } +
                project.tasks["jvmJar"].outputs.files +
                project.tasks["jsJar"].outputs.files
      dependencies.forEach { from(zipTree(it)) }
      into("/lib")
    }
  }
}