让 gradle/multiplatform 工作的唯一方法似乎是无休止的反复试验;这是一场噩梦,它不是作为“构建”系统构建的,而是作为“构建系统”构建的;换句话说,这两个工具(一起或单独)是一种仅实现插件制造商预期的单一软件开发生命周期的方法,但是,如果您设计了所需的软件生命周期和 CI/CD 系统,并且现在您尝试实现该工程,使用这些工具来实现它比使用脚本、代码或 maven 来实现它要困难得多。有许多的原因:
- 由于插件制造商只公开了最低可配置性,编码约定发生了巨大变化,可能只允许访问他们自己的个人项目所需的东西。
- 文档更新很差;Kotlin、gradle 和插件变化如此之快,我开始严重质疑这些工具的实用性。
因此,在撰写本文时,这似乎是使用 kotlin 1.3.72、multiplatform 1.3.72、ktor 1.3.2 和 gradle 6.2.2(使用 kts 格式)时使用的正确语法。
请注意,fatJar 似乎正确组装但无法运行,它找不到类,因此我包含了我同时使用的第二个 runLocally 任务。
这不是一个完整的解决方案,所以我讨厌在这里发布它,但据我所知......这是我在任何地方都能找到的最完整和最新的解决方案。
//Import variables from gradle.properties
val environment: String by project
val kotlinVersion: String by project
val ktorVersion: String by project
val kotlinExposedVersion: String by project
val mySqlConnectorVersion: String by project
val logbackVersion: String by project
val romeToolsVersion: String by project
val klaxonVersion: String by project
val kotlinLoggingVersion: String by project
val skrapeItVersion: String by project
val jsoupVersion: String by project
val devWebApiServer: String by project
val devWebApiServerVersion: 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 {
compilations {
val main = getByName("main")
tasks {
register<Jar>("buildFatJar") {
group = "application"
manifest {
attributes["Implementation-Title"] = "Gradle Jar File Example"
attributes["Implementation-Version"] = archiveVersion
attributes["Main-Class"] = "com.app.BackendAppKt"
}
archiveBaseName.set("${project.name}-fat")
from(main.output.classesDirs, main.compileDependencyFiles)
with(jar.get() as CopySpec)
}
register<JavaExec>("runLocally") {
group = "application"
setMain("com.app.BackendAppKt")
classpath = main.output.classesDirs
classpath += main.compileDependencyFiles
}
}
}
}
js {
browser { EXCLUDED FOR LENGTH }
}
sourceSets { EXCLUDED FOR LENGTH }
}