java - 从工件的 .jar 运行时找不到 Kotlinx Coroutines 类
问题描述
我正在使用 kotlinx 协程的 IntelliJ Idea IDE 上开发 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)
为什么 Kotlinx 协程java -jar file.jar
在生成的 .jar 工件上运行时不起作用?
解决方案
经过很长时间寻找这个问题的解决方案,我找到了两种解决方法。
第一的
生成的 .jar 工件不包含 Kotlinx 协程类,因为该工件是在将协程作为依赖项添加之前在 IntelliJ Idea 上设置的。
因此,工件配置不包括 Kotlinx 协程(似乎它不与新的依赖项添加和删除同步)。
为了解决这个问题,可以:
- 手动将依赖项添加到工件生成配置(在项目设置上),或者;
- 删除配置并重新创建。
第二
创建一个fatJar任务o 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
。
希望这可以帮助遇到同样问题的其他人:)
推荐阅读
- c# - 对象数组中的 NullReferenceException
- if-statement - check (char a) 语句有问题(使用 if 运算符)
- postgresql - 如何实现“类型是
postgresql 中的“rowid 索引表”概念,用于将表数据与新插入的数据进行比较 - vue.js - Vue I18n HTML 插值
- c# - C# 任务 - 聚合异常
- sql - 具有级联命名空间的 SQL Server Xml 查询
- sql - SQL Server:将 varchar 转换为数字时出错
- sql - 元数据库中的引脚图未显示引脚
- angular - 如何从父目录执行spring boot模块?
- css - 如何重新计算兄弟元素的样式?