У меня есть решение, которое работает с kotlin-multiplatform
версией плагина 1.3.31
и проектом, созданным с помощью опции IntelliJ New Project/Kotlin/JS Client and JVM Server | Gradle
.
buildscript {
repositories {
jcenter()
}
}
plugins {
id 'com.github.johnrengelman.shadow' version '5.0.0'
id 'kotlin-multiplatform' version '1.3.31'
}
import com.github.jengelman.gradle.plugins.shadow.tasks.ShadowJar
repositories {
jcenter()
maven { url "https://dl.bintray.com/kotlin/ktor" }
mavenCentral()
}
def ktor_version = '1.2.1'
def logback_version = '1.2.3'
kotlin {
jvm()
js() {
compilations.all {
kotlinOptions {
languageVersion = "1.3"
moduleKind = "umd"
sourceMap = true
metaInfo = true
}
}
}
sourceSets {
commonMain {
dependencies {
implementation kotlin('stdlib-common')
}
}
commonTest {
dependencies {
implementation kotlin('test-common')
implementation kotlin('test-annotations-common')
}
}
jvmMain {
dependencies {
implementation kotlin('stdlib-jdk8')
implementation "io.ktor:ktor-server-netty:$ktor_version"
implementation "io.ktor:ktor-html-builder:$ktor_version"
implementation "io.ktor:ktor-jackson:$ktor_version"
implementation "ch.qos.logback:logback-classic:$logback_version"
}
}
jvmTest {
dependencies {
implementation kotlin('test')
implementation kotlin('test-junit')
implementation "io.ktor:ktor-server-test-host:$ktor_version"
}
}
jsMain {
dependencies {
implementation kotlin('stdlib-js')
}
}
jsTest {
dependencies {
implementation kotlin('test-js')
}
}
}
}
def webFolder = new File(project.buildDir, "web")
def jsCompilations = kotlin.targets.js.compilations
task populateWebFolder(dependsOn: [jsMainClasses]) {
doLast {
copy {
from jsCompilations.main.output
from kotlin.sourceSets.jsMain.resources.srcDirs
jsCompilations.test.runtimeDependencyFiles.each {
if (it.exists() && !it.isDirectory()) {
from zipTree(it.absolutePath).matching { include '*.js' }
}
}
into webFolder
}
}
}
jsJar.dependsOn(populateWebFolder)
def mainServerClassName = "org.pongasoft.jamba.quickstart.server.be.ServerKt"
task run(type: JavaExec, dependsOn: [jvmMainClasses, jsJar]) {
main = mainServerClassName
ignoreExitValue = true
classpath {
[
kotlin.targets.jvm.compilations.main.output.allOutputs.files,
configurations.jvmRuntimeClasspath,
]
}
args = ["-P:org.pongasoft.jamba.quickstart.server.staticWebDir=${webFolder.canonicalPath}"]
}
task shadowJar(type: ShadowJar, dependsOn: [jvmJar]) {
from jvmJar.archiveFile
configurations = [project.configurations.jvmRuntimeClasspath]
manifest {
attributes 'Main-Class': mainServerClassName
}
}
Я считаю, что основной вопрос, почему он не работает, заключается в том, что, согласно документации:
От: Документация Shadow , Shadow - реактивный плагин. Это означает, что применение Shadow само по себе не будет выполнять настройку вашего проекта. Вместо этого Shadow реагирует. Это означает, что для большинства пользователей должны быть явно применены плагины java или groovy, чтобы получить желаемый эффект.
, и в результате он не работает из коробки с мультиплатформенным плагином kotlin, который имеет нетрадиционную настройку. Таким образом, хитрость заключается в том, чтобы определить задачу ShadowJar
, которая зависит от jvmJar
и использует артефакт в качестве его from
(jvmJar.archiveFile
) и конфигурации project.configurations.jvmRuntimeClasspath
для включения всех зависимостей времени выполнения. И это также место для определения записи Main-Class
для манифеста.
Обратите внимание, что эта версия не объединяет статические ресурсы, сгенерированные для части компиляции javascript.