Gradle 如何构建和运行协同程序基础示例?
我只是尝试按照上面的说明,在哪个状态下运行以下代码:Gradle 如何构建和运行协同程序基础示例?,gradle,kotlin,kotlin-coroutines,Gradle,Kotlin,Kotlin Coroutines,我只是尝试按照上面的说明,在哪个状态下运行以下代码: 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!
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
}
我在我的kotlin库/src/main/kotlin/coroutines.kt的文件中有这段代码。这是my build.gradle,位于根my kotlin库目录中:
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")
}
我可以使用gradlebuild
进行构建,生成以下工件(仅显示相关的):
没有生成错误,但是当我尝试运行它时,会得到一个NoClassDefFoundError
:
$ 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
我找到了coroutines jar文件,并尝试将其包含在类路径中:
$ 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之外使用协同程序构建和运行的好例子。我想出了一个解决方案,但我会把这个问题保留一段时间,以防其他人知道更好的方法。我只需要用
$HOME
替换瓷砖:
$ 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
按照建议,添加应用程序插件并在构建脚本中指定主类名后,我可以使用gradlerun
运行。然而,我并不能真正观察到消息以预期的延迟打印到控制台。我能够看到Gradle是如何使用Gradle run-I
运行我的类的,它生成了一个与上面类似的命令,除了它名为java-jar
并且在类路径中有以下所有路径:
/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会自动添加到类路径以及一些额外的jar。您应该将gradle构建配置为创建一个uber jar,该jar包含所有依赖项,并具有一个声明的主类,您可以简单地使用java-jar
运行,或者你应该让gradle构建并运行你的程序
要使后者起作用,请将其添加到build.gradle
:
apply plugin: 'application'
mainClassName = 'CoroutinesKt`
然后写
$ gradle run
在命令行上。虽然这样做有效,但会产生一些奇怪的计时问题。我能够看到Gradle使用
Gradle run-I
运行的实际命令,这与我在下面发布的答案非常相似。我将在那里分享更多细节。
$ gradle run