Kotlin readLine 函数导致的 NoClassDefFoundError

问题描述 投票:0回答:2

每当我尝试执行包含我的代码的 .jar 文件时,它都会抛出 NoClassDefFoundError:kotlin/io/ConsoleKt。到目前为止,我还没有找到这个问题的解决方案,但我认为这个问题与脚本中的

readLine()
函数有关,但我不知道是什么。奇怪的是,我的代码在 IntelliJ 本身中完美运行,但是一旦我构建它,它就开始抛出这个在 IntelliJ 之外从未发生过的异常。具体错误是:

Exception in thread "main" java.lang.NoClassDefFoundError: kotlin/io/ConsoleKt
        at com.quantumzizo.calcualtorkotlin.DisplayKt.main(Display.kt:23)
        at com.quantumzizo.calcualtorkotlin.DisplayKt.main(Display.kt)
Caused by: java.lang.ClassNotFoundException: kotlin.io.ConsoleKt
        at java.base/jdk.internal.loader.BuiltinClassLoader.loadClass(BuiltinClassLoader.java:641)
        at java.base/jdk.internal.loader.ClassLoaders$AppClassLoader.loadClass(ClassLoaders.java:188)
        at java.base/java.lang.ClassLoader.loadClass(ClassLoader.java:520)
        ... 2 more

有什么办法可以解决这个问题吗?

kotlin user-input
2个回答
2
投票

所以事实证明我所要做的就是构建一个包含所有依赖项的胖罐子。我使用Gradle插件Shadow制作了一个fat jar。 支持 @Endzeit 建议我使用它。


0
投票

如前所述,解决方案是将 Kotlin stdlib 捆绑到

.jar
文件中。
kotlin.io
被隐式导入到 Kotlin 代码中,因此编译完成时没有错误,但在运行时
java
无法找到丢失的字节码。具体来说,文件
kotlin/io/ConsoleKt.class
保存
readLine()
函数的字节码。

我只是想为经常直接调用 Kotlin 编译器的我们扩展可接受的答案。您需要

-include-runtime
选项,例如

kotlinc -include-runtime -d kotlin_app.jar

如果 jar 文件大小(对于小程序)约为 5MB,则可以看出包含运行时,而没有运行时的文件大小约为 1KB。

© www.soinside.com 2019 - 2024. All rights reserved.