如何从命令行运行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()
和其他顶级(函数类或接口之外main()
函数。 所以如果你的代码是:
// file App.kt package com.my.stuff public fun main(args: Array<String>) { ... }
然后你可以通过运行com.my.stuff.AppKt
类来执行程序。 这个名字来源于你的文件名,附加了Kt
。 您可以通过添加此文件目标注释来更改文件中此类的名称:
@file:JvmName("Foo")
你也可以把你的main()
放入一个伴随对象的类中,并使用JvmStatic
注解来使其成为static
的。 因此,您的班级名称是您选择的班级名称:
// file App.kt package com.my.stuff public class MyApp { companion object { @JvmStatic public fun main(args: Array<String>) { ... } } }
现在你只需运行com.my.stuff.MyApp
这个类
我还需要其他的JAR文件吗?
您需要您的应用程序JAR和任何依赖项。 对于在Maven / Gradle之外的Kotlin特定的JAR,您需要一个Kotlin发行版,其中包含:
-
kotlin-runtime.jar
(联合运行时和stdlib) -
kotlin-reflect.jar
只有在使用Kotlin反射 - 用于使用Kotlin断言类的单元测试的
kotlin-test.jar
在Maven / Gradle中目前还有一个单独的kotlin-stdlib.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-runtime.jar:MyApp.jar com.my.stuff.AppKt
请参阅上面关于您可能需要的其他JAR文件的注释。 如果您有一个可运行的JAR(清单指向com.my.stuff.AppKt
作为主类),则com.my.stuff.AppKt
:
java -cp $KOTLIN_LIB/kotlin-runtime.jar -jar MyApp.jar
使用Kotlin命令行工具运行
如果您通过Homebrew或其他软件包管理器安装Kotlin工具。 (在Mac OS X上brew update ; brew install kotlin
)然后运行非常简单:
kotlin -cp MyApp.jar com.my.stuff.AppKt
该命令将运行时添加到提供的类路径中,然后运行该类。 您可能需要添加其他Kotlin库,如上面的“从Java运行”部分所述。
使用Kotlin编译器创建可运行的JAR
这是不常见的,因为大多数人使用其他的构建工具,但是Kotlin编译器可以创建一个可运行的Jar,可以为你解决这个问题(参见http://kotlinlang.org/docs/tutorials/command-line.html )运行时和你的代码一起。 尽管在使用诸如Maven和Gradle等工具或IDE构建时,这并不常见。 然后使用普通的Java运行:
java -jar MyApp.jar
试着写:
java -cp <path to kotlin-runtime.jar>;<path to parent dir of _DefaultPackage.class> _DefaultPackage
例如:
java -cp kotlin-runtime.jar;. _DefaultPackage
我也为此苦苦挣扎了一段时间。 你很近,你只需要将你的jar包含在classpath中,并将你的“main”类的限定名称作为java的主参数。
你可以使用kotlinc
进行编译,如下所示:
$ kotlinc hello.kt -include-runtime -d hello.jar
然后你可以运行jar文件,如下所示:
$ java -jar hello.jar