我尝试使用ShadowJar gradle插件将我的ktor应用程序打包到fat jar中。但是由于shadowJar
任务,我每次都得到几乎空的jar。它只包含显式(主类正确设置)。
Gradle配置(groovy):
import org.gradle.jvm.tasks.Jar
buildscript {
ext.kotlin_version = '1.3.72'
ext.ktor_version = '1.3.2'
ext.serialization_version = '0.20.0'
ext.sl4j_version = '1.6.1'
repositories { jcenter() }
dependencies {
classpath 'com.github.jengelman.gradle.plugins:shadow:5.2.0'
classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version"
classpath "org.jetbrains.kotlin:kotlin-serialization:$kotlin_version"
}
}
plugins {
id 'org.jetbrains.kotlin.multiplatform' version '1.3.61'
}
apply plugin: 'kotlinx-serialization'
apply plugin: 'application'
apply plugin: 'java'
mainClassName = 'com.example.JvmMainKt'
apply plugin: 'com.github.johnrengelman.shadow'
repositories {
mavenCentral()
jcenter()
}
group 'com.example'
version '0.0.1'
apply plugin: 'maven-publish'
kotlin {
jvm {
}
js {
browser {
}
nodejs {
}
}
// For ARM, should be changed to iosArm32 or iosArm64
// For Linux, should be changed to e.g. linuxX64
// For MacOS, should be changed to e.g. macosX64
// For Windows, should be changed to e.g. mingwX64
mingwX64("mingw") {
binaries {
executable {
// Change to specify fully qualified name of your application's entry point:
entryPoint = 'main'
// Specify command-line arguments, if necessary:
runTask?.args('')
}
}
}
sourceSets {
commonMain {
dependencies {
implementation kotlin('stdlib-common')
implementation "org.jetbrains.kotlinx:kotlinx-serialization-runtime-common:$serialization_version"
implementation "io.ktor:ktor-client-core:$ktor_version"
}
}
commonTest {
dependencies {
implementation kotlin('test-common')
implementation kotlin('test-annotations-common')
}
}
jvmMain {
dependencies {
implementation kotlin('stdlib-jdk8')
implementation "org.jetbrains.kotlinx:kotlinx-serialization-runtime:$serialization_version"
implementation "io.ktor:ktor-serialization:$ktor_version"
implementation "io.ktor:ktor-server-netty:$ktor_version"
implementation "org.slf4j:slf4j-simple:$sl4j_version"
}
}
jvmTest {
dependencies {
implementation kotlin('test')
implementation kotlin('test-junit')
}
}
jsMain {
dependencies {
implementation kotlin('stdlib-js')
implementation "org.jetbrains.kotlinx:kotlinx-serialization-runtime-js:$serialization_version"
}
}
jsTest {
dependencies {
implementation kotlin('test-js')
}
}
mingwMain {
dependencies {
implementation "org.jetbrains.kotlinx:kotlinx-serialization-runtime-native:$serialization_version"
}
}
mingwTest {
}
}
}
shadowJar {
mainClassName = 'com.example.JvmMainKt'
mergeServiceFiles()
}
4条答案
按热度按时间nkcskrwz1#
marcu's answer是正确的,但他没有解释为什么剪切解决了他的问题,他的代码片段不能直接转换为
build.gradle.kts
,因为需要从Kotlin看到runtimeDependencyFiles
。在groovy中,他的代码片段可以工作,因为groovy支持鸭子类型,而Kotlin不支持。我在GradleKotlin中需要这个解决方案,所以我以这种方式分享它。
com.github.johnrengelman.shadow
gradle插件旨在与常规的java
gradle插件一起使用,该插件默认构建单个jar
,因此它会基于jar
类路径自动生成单个fat-jar
。Kotlin-Multiplatform
gradle插件的工作方式不同,它基于许多自定义设置为每个jvm
目标创建jar
文件,这些自定义设置使用Kotlin-Multiplatform
特有的方法进行设置,这就是为什么默认的shadowJar
任务在Kotlin-Multiplatform
上无法开箱即用。为了解决这个问题,我们必须为每个需要
fat-jar
的jvm
目标手动创建一个新的ShadowJar
任务,我们可以在声明目标之后(如marcu的示例所示)或在创建目标期间完成。我将展示这两种方法,但我建议在创建过程中这样做,以避免必须转换对象。另一件事是,我创建了函数来应用所需的配置,因为我有8个JVM目标,所以这样我就不需要复制粘贴8次剪切,我只调用函数。
创建目标时
代码中注解了以下说明:
删除注解
创建目标后
现在,我将只对更改进行评论:
删除注解
6jygbczu2#
我在过去也遇到过同样的问题,对我来说有效的语法(for groovy gradle)是:
hof1towb3#
我终于找到了解决问题的办法。
zour9fqk4#
我也遇到了同样的问题,上面的解决方案对我不起作用。
这是我的解决办法