我正在IntelliJ Idea IDE上开发一个使用kotlinx协程的Kotlin桌面应用程序。
这是我的build.gradle文件:
plugins {
id 'application'
id 'org.jetbrains.kotlin.jvm' version '1.3.60'
}
mainClassName = 'MainKt'
group 'my_group_name'
version '1.01'
repositories {
mavenCentral()
}
dependencies {
implementation 'org.jetbrains.kotlin:kotlin-stdlib-jdk8'
// Coroutines
implementation 'org.jetbrains.kotlinx:kotlinx-coroutines-core:1.3.2'
}
compileKotlin {
kotlinOptions.jvmTarget = "1.8"
}
compileTestKotlin {
kotlinOptions.jvmTarget = "1.8"
}
jar {
manifest {
attributes 'Main-Class': 'MainKt'
}
from { configurations.compile.collect { it.isDirectory() ? it : zipTree(it) } }
}
通过IDE运行项目时,一切工作正常,但是当我生成.jar工件并通过java -jar file.jar
运行该项目时,当类协程时抛出以下异常用于:
Exception in thread "Thread-2" java.lang.NoClassDefFoundError: kotlinx/coroutines/GlobalScope
Caused by: java.lang.ClassNotFoundException: kotlinx.coroutines.GlobalScope
at java.base/jdk.internal.loader.BuiltinClassLoader.loadClass(BuiltinClassLoader.java:583)
at java.base/jdk.internal.loader.ClassLoaders$AppClassLoader.loadClass(ClassLoaders.java:178)
at java.base/java.lang.ClassLoader.loadClass(ClassLoader.java:521)
在生成的.jar工件上运行java -jar file.jar
时,为什么Kotlinx协程不起作用?
答案 0 :(得分:1)
长时间寻找该问题的解决方案之后,我找到了两种解决方法。
生成的.jar工件不包含Kotlinx协程类,因为在协程被添加为依赖项之前 上已在IntelliJ Idea上设置了工件。
由于这个原因,工件配置不包含Kotlinx协程(似乎不与添加和删除的新依赖项同步)。
要解决该问题,可以:
按如下所示创建fatJar任务或gradle
jar {
manifest {
attributes 'Main-Class': 'MainKt'
}
}
task fatJar(type: Jar) {
manifest {
attributes 'Main-Class': 'MainKt'
}
baseName = project.name
from {
configurations.runtimeClasspath.collect {
it.isDirectory() ? it : zipTree(it)
}
}
with jar
}
并运行gradle任务
gradle fatJar
可以在build/libs
下找到输出。
希望这对遇到相同问题的其他人有所帮助:)