如何从命令行运行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 

我错过了什么?

知道你的主要类的名字

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

 // file App.kt package com.my.stuff public fun main(args: Array) { ... } 

然后你可以通过运行com.my.stuff.AppKt类来执行程序。 这个名字来源于你的文件名,附加了Kt 。 您可以通过添加此文件目标注释来更改文件中此类的名称:

 @file:JvmName("Foo") 

你也可以把你的main()放入一个伴随对象的类中,并使用JvmStatic注解来使其成为static的。 因此,您的class级名称是您选择的class级名称:

 // file App.kt package com.my.stuff public class MyApp { companion object { @JvmStatic public fun main(args: Array) { ... } } } 

现在你只需运行com.my.stuff.MyApp这个类

我还需要其他的JAR文件吗?

您需要您的应用程序JAR和任何依赖项。 对于在Maven / Gradle之外的Kotlin特定的JAR,您需要一个Kotlin发行版,其中包含:

  • kotlin-stdlib.jar (标准库)
  • kotlin-reflect.jar只有在使用Kotlinreflection
  • 用于使用Kotlin断言类的unit testing的kotlin-test.jar

从Intellij运行

如果在Intellij中(如果它是您的IDE),您可以右键单击main()函数并选择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作为主类),则com.my.stuff.AppKt

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

使用Kotlin命令行工具运行

如果您通过Homebrew或其他软件包管理器安装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构建时,这并不常见。 然后使用普通的Java运行:

 java -jar MyApp.jar 

试着写:

 java -cp ; _DefaultPackage 

例如:

 java -cp kotlin-runtime.jar;. _DefaultPackage 

你可以使用kotlinc进行编译,如下所示:

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

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

$ java -jar hello.jar

我也为此苦苦挣扎了一段时间。 你很近,你只需要将你的jar包含在classpath中,并将你的“main”类的限定名称作为java的主参数。