Fat Jar通过Gradle Kotlin DSL扩展了依赖关系

时间:2019-06-09 21:21:27

标签: gradle gradle-kotlin-dsl

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

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

但是,胖子罐扩展了所有依赖项。我想将jars包含在/ lib目录中,但是我无法确定如何实现。

任何人都可以提供有关如何实现此目标的任何指示吗?

谢谢

2 个答案:

答案 0 :(得分:1)

好吧,您在规范的zipTree部分中使用map,并且其行为符合the documentation:它将非目录文件解压缩。

如果您想要/lib中的罐子,请将from替换为:

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

答案 1 :(得分:0)

如果有人使用kotlin-multiplatform插件,则配置会有所不同。这是一个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")
    }
  }
}