将反射库包含在kotlinc输出的jar中

时间:2017-04-11 05:36:58

标签: kotlin kotlinc

我正在尝试将反射库包含在示例jar中,但无法使其工作:

$ kotlinc hello.kt -d hello.jar
$ java -jar hello.jar
Exception in thread "main" java.lang.NoClassDefFoundError: kotlin/jvm/internal/Intrinsics

缺少运行时库,所以让我们添加它:

$ kotlinc hello.kt -include-runtime -d hello.jar
$ java -jar hello.jar
Exception in thread "main" kotlin.jvm.KotlinReflectionNotSupportedError: Kotlin reflection implementation is not found at runtime. Make sure you have kotlin-reflect.jar in the classpath

现在包含了运行时库,但缺少反射库,所以让我们指定kotlin主目录:

$ kotlinc hello.kt -include-runtime -kotlin-home ~/.sdkman/candidates/kotlin/1.1.1 -d hello.jar
$ java -jar hello.jar
Exception in thread "main" kotlin.jvm.KotlinReflectionNotSupportedError: Kotlin reflection implementation is not found at runtime. Make sure you have kotlin-reflect.jar in the classpath

仍未包含反射库。 kotlinc帮助会列出“-no-reflect”选项,因此我假设在设置“-include-runtime”时默认情况下应包含反射库,但这似乎不是情况下。

1 个答案:

答案 0 :(得分:5)

目前-include-runtime选项仅包含生成的jar的标准Kotlin库(kotlin-stdlib)。除非指定了kotlin-reflect选项,否则还应该包含反射库(-no-reflect)。我在跟踪器中创建了一个问题:https://youtrack.jetbrains.com/issue/KT-17344

在问题解决之前:如果您正在寻找仅在您的计算机上运行已编译程序的方法,我建议您将应用程序编译到目录而不是jar,然后运行主类使用kotlin命令。

kotlinc hello.kt -d output
kotlin -cp output hello.HelloKt

如果您计划将程序分发给其他用户,我建议使用正确的构建系统,如Maven或Gradle,并指定kotlin-stdlib / kotlin-reflect作为正确的依赖项,而不是将它们与您的应用程序捆绑在一起。