尝试为包含 ktor 服务器组件的 kotlin 多平台项目创建一个可运行的 jar,使用 Kotlin Gradle DSL 构建。
我看到了几个问题,包括Create fat jar from kotlin multiplatform project它询问并回答了如何在 Groovy 中创建 gradle 构建文件,但是你如何在 kotlin dsl 中做到这一点?
报告工作的常规代码是:
kotlin {
jvm() {
withJava()
jvmJar {
manifest {
attributes 'Main-Class': 'sample.MainKt'
}
from { configurations.runtimeClasspath.collect { it.isDirectory() ? it : zipTree(it) } }
}
}
...
}
这将如何转化为 Kotlin DSL?我尝试了许多变体,其中一些可以编译和运行,但没有创建所需的输出……一个可运行的 jar。
最佳答案
我花了 3 天时间试图让 fat jar 子工作,以下是解决方案以及解决方案澄清之前的内容:
我早期犯的错误
注意:不需要影子插件,这太棒了(恕我直言,gradle 插件往往不能很好地协同工作)。
注意:版本控制很重要,因为在某些情况下,此堆栈的更改速度似乎比文档快 50 倍,此解决方案使用了以下内容:
代码 :
//Import variables from gradle.properties
val environment: String by project
val kotlinVersion: String by project
val ktorVersion: String by project
//Build File Configuration
plugins {
java
kotlin("multiplatform") version "1.3.72"
}
group = "com.app"
version = "1.0-SNAPSHOT"
repositories {
mavenCentral()
jcenter()
jcenter {
url = uri("https://kotlin.bintray.com/kotlin-js-wrappers")
}
maven {
url = uri("https://jitpack.io")
}
}
//Multiplatform Configuration
kotlin {
jvm {
withJava()
compilations {
val main = getByName("main")
tasks {
register<Jar>("buildFatJar2") {
group = "application"
dependsOn(build)
manifest {
attributes["Main-Class"] = "com.app.BackendAppKt"
}
from(configurations.getByName("runtimeClasspath").map { if (it.isDirectory) it else zipTree(it) }, main.output.classesDirs)
archiveBaseName.set("${project.name}-fat2")
}
}
}
}
js {
browser {
}
}
sourceSets { SKIPPED FOR LENGTH }
}
我希望这可以为某人节省 3 天,如果您发现改进,请告诉我(我也在学习)。 Kotlin、gradle、多平台、docker……都很难处理,他们需要并行更新文档恕我直言,否则 jetbrains 注定要失败。潜在的改进 :
关于gradle-kotlin-dsl - 使用 Kotlin Gradle DSL 从 ktor Kotlin 多平台项目创建胖 jar,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61245847/