Как мне создать и запустить примеры основ сопрограммы? - PullRequest
1 голос
/ 28 марта 2019

Я просто пытаюсь следовать инструкциям на этой странице , в которых указано, что нужно выполнить следующий код:

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 / Главный / Kotlin / coroutines.kt.Это мой build.gradle, расположенный в корневом каталоге my-kotlin-library:

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, который производит следующие артефакты (только отображающие соответствующие):

build
├── classes
│   └── kotlin
│       └── main
│           ├── CoroutinesKt$main$1.class
│           ├── CoroutinesKt.class
│           └── META-INF
│               └── my-kotlin-library.kotlin_module
└── libs
    └── my-kotlin-library.jar

Нет ошибок сборки, но когда я пытаюсь запустить его, я получаю 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

Я нашел файл 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.

Ответы [ 2 ]

1 голос
/ 29 марта 2019

Вы должны либо сконфигурировать вашу сборку gradle для создания uber-jar, который содержит все ваши зависимости и имеет объявленный основной класс, который вы можете запустить просто с помощью java -jar <jarname>, либо вы должны позволить gradle build и запускать вашу программу.

Чтобы последние работали, добавьте это к build.gradle:

apply plugin: 'application'
mainClassName = 'CoroutinesKt`

, а затем напишите

$ gradle run

в командной строке.

0 голосов
/ 29 марта 2019

Я нашел решение, но оставлю вопрос на некоторое время открытым, на случай, если кто-то другой знает лучший способ. Мне просто нужно было заменить тильду на $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

После добавления плагина приложения и указания имени основного класса в моем скрипте сборки, как было предложено здесь , я смог запустить с gradle run. Однако я не мог наблюдать за сообщениями, выводимыми на консоль, с задержками, как предполагалось. Я смог увидеть, как 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-файлами.

...