1

我正在从命令行构建一个 kotlin jvm 项目。

平原kotlinc foo.kt -include-runtime -d example.jarkotlin test.jar序列运作良好。

然而,我只是第一次在我的代码中使用协程,由此产生的消息让我明白我必须在编译中包含协程 jar 文件。

kotlinc -include-runtime -classpath /snap/kotlin/current/lib/kotlinx-coroutines-core-1.0.1.jar -d example.jar example.kt

尝试运行它,两者

kotlin example.jar
kotlin -classpath /snap/kotlin/current/lib/kotlinx-coroutines-core-1.0.1.jar example.jar

Exception in thread "main" java.lang.NoClassDefFoundError: kotlinx/coroutines/BuildersKt,这很令人烦恼,因为 jarfile 似乎包含这些符号:

$ unzip -l /snap/kotlin/current/lib/kotlinx-coroutines-core-1.0.1.jar |grep BuildersKt
     3687  2018-11-08 08:14   kotlinx/coroutines/BuildersKt.class
     8270  2018-11-08 08:14   kotlinx/coroutines/BuildersKt__Builders_commonKt.class
     3902  2018-11-08 08:14   kotlinx/coroutines/BuildersKt__BuildersKt.class

回想一下,kotlin Jarfile就像java -jar Jarfile

$ java -classpath /snap/kotlin/current/lib/kotlinx-coroutines-core-1.0.1.jar -jar example.jar
Exception in thread "main" java.lang.NoClassDefFoundError: kotlinx/coroutines/BuildersKt
    at ExampleKt.main(example.kt:16)
Caused by: java.lang.ClassNotFoundException: kotlinx.coroutines.BuildersKt
    at java.base/jdk.internal.loader.BuiltinClassLoader.loadClass(BuiltinClassLoader.java:582)
    at java.base/jdk.internal.loader.ClassLoaders$AppClassLoader.loadClass(ClassLoaders.java:190)
    at java.base/java.lang.ClassLoader.loadClass(ClassLoader.java:499)
    ... 1 more

在不使用 gradle 之类的情况下,有人可以解释必须为 kotlin/java 的命令行指定什么以使其了解如何通过访问协程功能来构建或运行吗?提前致谢!

4

1 回答 1

1

编辑 example.jar 的 META-INF/MANIFEST.MF:添加带有协程 jar 位置的 Class-Path

Class-Path: /snap/kotlin/current/lib/kotlinx-coroutines-core-1.0.1.jar

然后运行:kotlin example.jarjava -jar example.jar

于 2020-02-20T09:01:35.607 回答