我刚刚开始使用Kotlin,在理解收件箱文件的工作方式方面遇到了一些问题.我有两个文件:

hello.kt

class HelloWorld {
    public fun speak() {
        println("hello world")
    }
}

main.kt

fun main() {
    val hello = HelloWorld()
    hello.speak()
}

我的项目 struct 是:

root
|-hello.kt
|-main.kt

我的目的是构建Kotlin应用程序,将其类分布在肮脏的收件箱文件中. 我用

kotlinc hello.kt -d hello.jar
kotlinc main.kt -cp hello.jar -include-runtime -d main.jar

来构建收件箱文件.这两个命令执行时没有任何错误.我无法理解如何执行应用程序.

到目前为止我已经try 过了

java -cp hello.jar -jar main.jar

运行应用程序,但我得到这个错误:

Exception in thread "main" java.lang.NoClassDefFoundError: HelloWorld
        at MainKt.main(main.kt:2)
        at MainKt.main(main.kt)
Caused by: java.lang.ClassNotFoundException: HelloWorld
        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:526)
        ... 2 more

我还try 遵循this question的答案,这显示了同样的问题,但正在运行

java -cp main.jar:hello.jar MainKt

给我以下错误

Error: Could not find or load main class MainKt
Caused by: java.lang.ClassNotFoundException: MainKt

总体而言,我对Kotlin和Java很陌生,但我找不到解决方案.

推荐答案

首先要注意的是,您通常会使用Gradle等构建工具来为您进行编译和打包.然而,出于学习目的,了解引擎盖下的事物如何组合在一起总是很好的.

就您的情况而言,您正在正确地编写内容.然而,如何使用java命令run应用程序存在问题.首先,您不能将-cp-jar混合在一起,按照the documentation:

使用-jar时,指定的收件箱文件是所有用户类的源,并且其他类路径设置将被忽略.如果您正在使用收件箱文件,请参阅jar.

简而言之,您必须 Select 将-jar与包含所有类路径信息的可执行jar文件一起使用,还是将-cp与您需要的所有jar+主类名称一起使用.

由于您没有摆弄jar list ,因此您不会创建可执行jar,因此您应该坚持使用-cp选项.您需要在-cp选项中提供所需的所有jar(在Linux或Mac上以:分隔,在Windows上以;分隔),以及命令末尾的主类别名称:

java -cp "hello.jar;main.jar" MainKt

主类MainKt的名称源自包含您的main()函数的文件名和文件内的包名称,定义为(尽管很微妙)in the Kotlin documentation.

您还可以查看this answer以了解更多详细信息.

Kotlin相关问答推荐

如何访问方法引用的接收者?

在Jetpack Compose中创建波浪式文本动画:顺序中断问题

如何接受任何派生类KClass

禁用 Gradle执行消息

在 Kotlin 中将 Array 转换为 IntArray 时丢失值

Kotlin 协程:flatMapLatest 什么都不发出

Kotlin中用于调用常量名称的枚举类方法之间的区别

如何在 Kotlin 中使用具有继承的泛型

parallelStream()和asSequence().asStream().parallel()之间的区别

为什么我们在 kotlin 中需要 noinline?

SpringBoot 2.5.0 对于 Jackson Kotlin 类的支持,请在类路径中添加com.fasterxml.jackson.module: jackson-module-kotlin

如何有效地填充 Gradle Kotlin DSL 中的额外属性?

零安全的好处

如何修复 ViewPager2 中的Design assumption violated错误?

将多个 Kotlin 流合并到一个列表中,而无需等待第一个值

当被Spring代理类访问时,Kotlin实例变量为null

如何将map函数应用于Kotlin中的数组并更改其值?

我们如何在Java注释声明中引用Kotlin常量?

在Kotlin中创建通用二维数组

RxJava - 每秒发出一个 observable