【问题标题】:Kotlinx Coroutines classes not found when running from the artifact's .jar从工件的 .jar 运行时找不到 Kotlinx Coroutines 类
【发布时间】:2020-03-20 01:35:47
【问题描述】:

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

【问题讨论】:

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


    【解决方案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下找到。


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

    【讨论】:

      猜你喜欢
      • 2017-01-28
      • 1970-01-01
      • 2013-06-30
      • 2020-07-28
      • 2016-05-21
      • 2019-10-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多