我知道之前已经问过这个问题,但那里没有任何信息对我有帮助。
这是我的情况:我无法运行已编译的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
我错过了什么?
答案 0 :(得分:83)
要运行Kotlin类,您实际上正在运行一个特殊类,该类在文件级别创建,用于保存您的main()
和其他顶级函数(在类或接口之外)。所以,如果你的代码是:
// file App.kt
package com.my.stuff
fun main(args: Array<String>) {
...
}
然后您可以通过运行com.my.stuff.AppKt
类来执行该程序。此名称源自您的文件名,并附加Kt
。您可以通过添加此file-targeted annotation:
@file:JvmName("Foo")
您还可以将main()
放入包含伴随对象的班级,并使用static
注释将其设为JvmStatic
。因此,您的班级名称是您选择的名称:
// file App.kt
package com.my.stuff
class MyApp {
companion object {
@JvmStatic fun main(args: Array<String>) {
...
}
}
}
现在您只需运行课程com.my.stuff.MyApp
您需要应用程序JAR和任何依赖项。对于Kotlin特定的JAR,当你在Maven / Gradle之外时,你需要一个包含以下内容的Kotlin发行版:
kotlin-stdlib.jar
(标准库)kotlin-reflect.jar
仅限于使用Kotlin反射kotlin-test.jar
用于使用Kotlin断言类的单元测试如果在Intellij中(如果它是您的IDE),您可以右键单击main()
函数并选择Run,它将为您创建运行时配置并显示将使用的完全限定类名。如果您不确定生成的类的名称,可以随时使用它。
您还可以使用Gradle Application plugin从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
如果你有一个可运行的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
如果您通过Homebrew或其他软件包管理器安装Kotlin工具。 (在Mac OS X上brew update ; brew install kotlin
)然后运行起来非常简单:
kotlin -cp MyApp.jar com.my.stuff.AppKt
此命令将stdlib添加到提供的类路径,然后运行该类。您可能需要添加其他Kotlin库,如上面的“从Java运行”一节中所述。
这并不常见,因为大多数人使用其他构建工具,但Kotlin编译器可以创建一个可运行的Jar,当它将运行时和代码捆绑在一起时,可以为您解决这个问题(请参阅http://kotlinlang.org/docs/tutorials/command-line.html)。虽然使用Maven和Gradle等工具或IDE构建时并不常见。然后使用普通的Java:
运行java -jar MyApp.jar
答案 1 :(得分:8)
您可以使用kotlinc
进行编译,如下所示:
$ kotlinc hello.kt -include-runtime -d hello.jar
然后你可以按如下方式运行jar文件:
$ java -jar hello.jar
答案 2 :(得分:6)
尝试写:
java -cp <path to kotlin-runtime.jar>;<path to parent dir of _DefaultPackage.class> _DefaultPackage
例如:
java -cp kotlin-runtime.jar;. _DefaultPackage
答案 3 :(得分:3)
我也挣扎了一段时间。你很接近,你只需要在类路径中包含你的jar并将你的“main”类的限定名称作为java的主要参数传递。