从工件的.jar运行时找不到Kotlinx Coroutines类

时间:2019-11-24 17:18:46

标签: java intellij-idea kotlin coroutine kotlin-coroutines

我正在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协程不起作用?

1 个答案:

答案 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下找到输出。


希望这对遇到相同问题的其他人有所帮助:)