首页 > 解决方案 > 从工件的 .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 工件上运行时不起作用?

标签: javaintellij-ideakotlincoroutinekotlin-coroutines

解决方案


经过很长时间寻找这个问题的解决方案,我找到了两种解决方法。


第一的

生成的 .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


希望这可以帮助遇到同样问题的其他人:)


推荐阅读