如何从命令行运行 Kotlin 类?

我知道以前也有人问过这个问题,但是没有一个信息对我有帮助。

我的情况是: 我无法运行已编译的 Kotlin 类。当我试图像运行一个普通的 java 类一样运行它时,我得到了以下结果:

C:\Users\User\Desktop>java _DefaultPackage


Exception in thread "main" java.lang.NoClassDefFoundError: jet/runtime/Intrinsics
at _DefaultPackage.main(Finder.kt)
Caused by: java.lang.ClassNotFoundException: jet.runtime.Intrinsics
at java.net.URLClassLoader$1.run(URLClassLoader.java:366)
at java.net.URLClassLoader$1.run(URLClassLoader.java:355)
at java.security.AccessController.doPrivileged(Native Method)
at java.net.URLClassLoader.findClass(URLClassLoader.java:354)
at java.lang.ClassLoader.loadClass(ClassLoader.java:423)
at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:308)
at java.lang.ClassLoader.loadClass(ClassLoader.java:356)
... 1 more

这让我相信,考虑到输出,Kotlin 运行时根本就不存在:

C:\Users\User\Desktop>java -cp kotlin-runtime.jar _DefaultPackage


Error: Could not find or load main class _DefaultPackage

这让我想到,也许我需要将类文件添加到声明的类路径中,以便:

C:\Users\User\Desktop>java -cp kotlin-runtime.jar';_DefaultPackage.class _DefaultPackage


Error: Could not find or load main class _DefaultPackage

我错过了什么?

48889 次浏览

我也为此挣扎了一段时间。很接近了,只需要将 jar 包含在类路径中,并将“ main”类的限定名作为主参数传递给 java。

知道你的主要班级的名称

要运行一个 Kotlin 类,实际上您正在运行一个特殊的类,该类是在文件级别创建的,用于保存 main()和其他顶级函数(在类或接口之外)。所以如果你的代码是:

// file App.kt
package com.my.stuff


fun main(args: Array<String>) {
...
}

然后可以通过运行 com.my.stuff.AppKt类来执行程序。此名称是从附加 Kt的文件名派生的。通过添加以下 以文件为目标的注释,您可以在文件中更改这个类的名称:

@file:JvmName("Foo")

您还可以将 main()放入一个具有伴随对象的类中,并使用 JvmStatic注释将其设置为 static。因此,你选择的类名是:

// file App.kt
package com.my.stuff


class MyApp {
companion object {
@JvmStatic fun main(args: Array<String>) {
...
}
}
}

现在运行类 com.my.stuff.MyApp

我还需要什么其他 JAR 文件?

您需要您的应用程序 JAR 和任何依赖项。对于特定于 Kotlin 的 JAR,当你不在 Maven/Gradle 时,你需要一个包含以下内容的 Kotlin 发行版:

  • kotlin-stdlib.jar(标准库)
  • 只有在使用考特林反射时才使用 kotlin-reflect.jar
  • kotlin-test.jar用于使用 Kotlin 断言类的单元测试

逃离 Intellij

如果在 Intellij (如果是您的 IDE) ,您可以右键单击 abc0函数并选择 Run,它将为您创建一个运行时配置,并显示将使用的完全限定类名。如果不确定生成的类的名称,可以始终使用它。

逃离 Gradle

您还可以使用 Gradle Application 插件从 Gradle 运行一个进程,或者创建一个可运行的系统,该系统包括您的 JAR 及其所有依赖项的 zip/tgz,以及一个启动脚本。使用上面的示例类,您可以将其添加到 build.gradle:

apply plugin: 'application'


mainClassName = 'com.my.stuff.AppKt'


// optional:  add one string per argument you want as the default JVM args
applicationDefaultJvmArgs = ["-Xms512m", "-Xmx1g"]

然后从命令行使用:

// run the program
gradle run


// debug the program
gradle run --debug-jvm


// create a distribution (distTar, distZip, installDist, ...)
gradle distTar

直接从 Java 命令行运行

如果您有一个可运行的 JAR,并假设 KOTLIN_LIB指向 Kotlin 运行时库文件所在的目录:

java -cp $KOTLIN_LIB/kotlin-stdlib.jar:MyApp.jar com.my.stuff.AppKt

请参阅上面关于您可能需要的其他 JAR 文件的说明。如果您有一个可运行的 JAR (清单指向 com.my.stuff.AppKt作为主类) ,那么有一个小小的变化:

java -cp $KOTLIN_LIB/kotlin-stdlib.jar -jar MyApp.jar

使用 Kotlin 命令行工具运行

如果您通过 自酿的或其他软件包管理器安装 Kotlin 工具。(在 Mac OS X brew update ; brew install kotlin上)然后运行起来非常简单:

kotlin -cp MyApp.jar com.my.stuff.AppKt

此命令将 stdlib 添加到提供的类路径中,然后运行该类。您可能需要添加额外的 Kotlin 库,正如上面“从 Java 运行”一节中提到的那样

使用 Kotlin 编译器创建可运行的 JAR

这并不常见,因为大多数人都使用其他构建工具,但是 Kotlin 编译器可以创建一个可运行的 Jar,当它将运行时和代码捆绑在一起时,它可以为您解决这个问题(参见 http://kotlinlang.org/docs/tutorials/command-line.html)。尽管在使用诸如 Maven 和 Gradle 或 IDE build 等工具时,这种情况并不常见。然后使用普通 Java 运行:

java -jar MyApp.jar

可以使用 kotlinc编译如下:

$kotlinc hello.kt-include-running-d hello.jar

然后您可以运行 jar 文件,如下所示:

$java-jar hello. jar

有几种方法可以从命令行运行 Kotlin,这取决于您使用的是 Java 字节码编译器(kotlinc)还是本机编译器(kotlinc 本机)。

如果收到关于 -include-runtime的错误消息,请仔细阅读该消息。您可能正在使用 Kotlin 本地人编译器而不是 Kotlin 字节码编译器。如果要使用本机编译器,请参阅下面的第二部分。

(Java 字节码)

重要的是要考虑到,当您尝试运行项目时,您可能不在与 main.kt相同的文件夹中,而且并不总是清楚如何告诉 Kotlin (或 Java)找到它。

假设:

  • 你试图从一个命令提示符编译和运行。
  • 您有这样的项目结构(在 IntelliJ Ideas 设置了一个命令行 Kotlin 项目之后) :
MyNiftyProject
src
main
kotlin
main.kt
  • 您在项目根目录中。
  • 你有这个 main.kt文件:
fun main(args: Array<String>) {
println("Hello World!")
}

编译如下:

kotlinc src/main/kotlin/main.kt -include-runtime -d MyNiftyProject.jar

这将把 MyNiftyProject.jar放在项目的 中。

然后使用 java命令行工具这样运行:

java -jar MyNiftyProject.jar

或者像这样使用 kotlin命令行工具运行:

kotlin -classpath MyNiftyProject.jar MainKt

Kotlinc 本地人

对于本机代码,这个过程比较简单:

kotlinc-native src/main/kotlin/main.kt -o MyNiftyProject

这将把 MyNiftyProject.exe放在项目的 中。

然后你只需要把它作为一个普通的 Windows 可执行文件运行:

MyNiftyProject.exe

如果您使用的是由 IntellijeIdead 生成的 jar 文件,那么您应该像运行 java 文件一样运行 kotlin 文件,但是考虑到 kotlin 文件名应该是这样的: 你的文件: test.kt Jar 中的输出: testKt

java -cp file.jar yourPackage.testKt