首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何构建和运行协程基础示例?

如何构建和运行协程基础示例?
EN

Stack Overflow用户
提问于 2019-03-29 03:56:09
回答 2查看 429关注 0票数 3

我只是尝试遵循this page上的说明,在哪个状态下运行以下代码:

代码语言:javascript
运行
复制
import kotlinx.coroutines.*

fun main() {
    GlobalScope.launch { // launch new coroutine in background and continue
        delay(1000L) // non-blocking delay for 1 second (default time unit is ms)
        println("World!") // print after delay
    }
    println("Hello,") // main thread continues while coroutine is delayed
    Thread.sleep(2000L) // block main thread for 2 seconds to keep JVM alive
}

我在my-kotlin-library/src/main/kotlin/coroutines.kt.的一个文件中有这段代码这是我的库,位于根目录my -kotlin- build.gradle中:

代码语言:javascript
运行
复制
plugins {
    kotlin("jvm") version "1.3.21"
}

repositories {
    jcenter()
}

dependencies {
    implementation(kotlin("stdlib"))
    implementation("org.jetbrains.kotlinx:kotlinx-coroutines-core:1.1.1")
    testImplementation("junit:junit:4.12")
}

我可以使用gradle build进行构建,它会生成以下工件(仅显示相关内容):

代码语言:javascript
运行
复制
build
├── classes
│   └── kotlin
│       └── main
│           ├── CoroutinesKt$main$1.class
│           ├── CoroutinesKt.class
│           └── META-INF
│               └── my-kotlin-library.kotlin_module
└── libs
    └── my-kotlin-library.jar

没有构建错误,但是当我尝试运行它时,我得到了一个NoClassDefFoundError

代码语言:javascript
运行
复制
$ kotlin -cp build/libs/my-kotlin-library.jar CoroutinesKt
Exception in thread "main" java.lang.NoClassDefFoundError: kotlinx/coroutines/GlobalScope
    at CoroutinesKt.main(coroutines.kt:4)
    at CoroutinesKt.main(coroutines.kt)
    at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
    at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.base/java.lang.reflect.Method.invoke(Method.java:564)
    at org.jetbrains.kotlin.runner.AbstractRunner.run(runners.kt:61)
    at org.jetbrains.kotlin.runner.Main.run(Main.kt:109)
    at org.jetbrains.kotlin.runner.Main.main(Main.kt:119)
Caused by: java.lang.ClassNotFoundException: kotlinx.coroutines.GlobalScope
    at java.base/java.net.URLClassLoader.findClass(URLClassLoader.java:466)
    at java.base/java.lang.ClassLoader.loadClass(ClassLoader.java:566)
    at java.base/java.lang.ClassLoader.loadClass(ClassLoader.java:499)
    ... 9 more

我找到了协程jar文件,并尝试将其包含在类路径中:

代码语言:javascript
运行
复制
$ kotlin -cp ~/.gradle/caches/modules-2/files-2.1/org.jetbrains.kotlinx/kotlinx-coroutines-core/1.1.1/3d2b7321cdef9ebf9cb7729ea4f75a6f6457df86/kotlinx-coroutines-core-1.1.1.jar:build/libs/my-kotlin-library.jar CoroutinesKt

不幸的是,这产生了同样的错误。我必须有一些不正确的配置,但我找不到一个好的例子,使用Android Studio或IntelliJ IDEA之外的协程来构建和运行。

EN

回答 2

Stack Overflow用户

发布于 2019-03-29 05:26:12

我找到了一个解决方案,但我会把这个问题留待一段时间,以防其他人知道更好的方法。我只需要用$HOME替换掉波浪号

代码语言:javascript
运行
复制
$ kotlin -cp $HOME/.gradle/caches/modules-2/files-2.1/org.jetbrains.kotlinx/kotlinx-coroutines-core/1.1.1/3d2b7321cdef9ebf9cb7729ea4f75a6f6457df86/kotlinx-coroutines-core-1.1.1.jar:build/libs/my-kotlin-library.jar CoroutinesKt

在添加了应用程序插件并在构建脚本中指定了主类名称之后,我就可以使用gradle run运行了。然而,我并不能真正观察到打印到控制台的消息具有预期的延迟。我可以看到Gradle是如何使用gradle run -i运行我的类的,它产生了一个与上面的命令类似的命令,只是它名为java -jar,并且在类路径中有以下所有路径:

代码语言:javascript
运行
复制
/Users/dave.kennedy/Code/kotlin/my-kotlin-library/build/classes/java/main
/Users/dave.kennedy/Code/kotlin/my-kotlin-library/build/classes/kotlin/main
/Users/dave.kennedy/Code/kotlin/my-kotlin-library/build/resources/main
/Users/dave.kennedy/.gradle/caches/modules-2/files-2.1/org.jetbrains.kotlinx/kotlinx-coroutines-core/1.1.1/3d2b7321cdef9ebf9cb7729ea4f75a6f6457df86/kotlinx-coroutines-core-1.1.1.jar
/Users/dave.kennedy/.gradle/caches/modules-2/files-2.1/org.jetbrains.kotlin/kotlin-stdlib/1.3.21/4bcc2012b84840e19e1e28074284cac908be0295/kotlin-stdlib-1.3.21.jar
/Users/dave.kennedy/.gradle/caches/modules-2/files-2.1/org.jetbrains.kotlinx/kotlinx-coroutines-core-common/1.1.1/7ed04382bdf0c89c5d87ac462aa4935ae8e85243/kotlinx-coroutines-core-common-1.1.1.jar
/Users/dave.kennedy/.gradle/caches/modules-2/files-2.1/org.jetbrains.kotlin/kotlin-stdlib-common/1.3.21/f30e4a9897913e53d778f564110bafa1fef46643/kotlin-stdlib-common-1.3.21.jar
/Users/dave.kennedy/.gradle/caches/modules-2/files-2.1/org.jetbrains/annotations/13.0/919f0dfe192fb4e063e7dacadee7f8bb9a2672a9/annotations-13.0.jar

当使用kotlin命令运行时,stdlib会自动添加到类路径以及一些额外的jars中。

票数 1
EN

Stack Overflow用户

发布于 2019-03-29 16:01:01

您可以将gradle构建配置为创建一个包含所有依赖项并具有声明的主类的uber-jar,您可以简单地使用java -jar <jarname>运行它,或者您应该让gradle构建并运行您的程序。

要使用后一种方法,请将以下代码添加到build.gradle

代码语言:javascript
运行
复制
apply plugin: 'application'
mainClassName = 'CoroutinesKt`

然后写下

代码语言:javascript
运行
复制
$ gradle run

在命令行中。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/55405905

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档