我理解这个问题已经被问过,但没有任何信息有帮助了我。
这里是我的情况:我不能运行编译科特林类。 当我尝试像我一个普通的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
这使我相信,科特林运行时被简单地丢失,因为输出。 所以,我试过如下:
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
我在想什么?
认识你的主类的名称
要运行科特林类,你实际上是运行握住你是在文件级别创建一类特殊的main()
是顶级(A类或接口外)等功能。 所以,如果你的代码是:
// file App.kt
package com.my.stuff
fun main(args: Array<String>) {
...
}
然后,你可以通过运行执行程序com.my.stuff.AppKt
类。 这个名字是从文件名派生用Kt
追加。 您可以通过添加此更改文件中这一类的名称的文件有针对性的注释 :
@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文件,我需要?
你需要你的应用程序JAR和任何依赖。 对于科特林特定的JAR当Maven /摇篮之外,你需要包含一个科特林分布:
-
kotlin-stdlib.jar
(标准库) -
kotlin-reflect.jar
仅当使用科特林反射 -
kotlin-test.jar
为使用科特林断言类的单元测试
从运行的IntelliJ
如果在的IntelliJ(如果它是你的IDE),您可以右键在点击main()
函数,并选择运行,它会为你创建一个运行时配置,并表明将要使用的完全限定类名。 您可以随时使用,如果您不确定生成的类的名称。
从摇篮运行
您也可以使用摇篮应用插件从摇篮运行过程中,或创建一个可运行的系统,包括你的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
点到科特林运行时库文件所在的目录:
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
使用科特林命令行工具运行
如果通过安装科特林工具自制或其他包管理器。 (在Mac OS X brew update ; brew install kotlin
)然后,它是非常简单的运行:
kotlin -cp MyApp.jar com.my.stuff.AppKt
此命令将STDLIB提供的类路径,然后运行类。 您可能需要添加额外的科特林库,在上面的部分中提到的“从Java运行。”
创建运行的JAR与科特林编译
这是不是很常见,因为大多数人使用其他的构建工具,但科特林编译器可以创建一个运行的JAR可以解决这件事情(见http://kotlinlang.org/docs/tutorials/command-line.html ),当它捆绑运行时,你的代码放在一起。 尽管使用工具如Maven和摇篮时,这是不常见,或IDE构建。 然后运行使用普通的Java:
java -jar MyApp.jar
你可以编译使用kotlinc
如下:
$ kotlinc hello.kt -include-运行-d hello.jar
然后你就可以运行如下jar文件:
$ Java的罐子hello.jar
试着写:
java -cp <path to kotlin-runtime.jar>;<path to parent dir of _DefaultPackage.class> _DefaultPackage
例如:
java -cp kotlin-runtime.jar;. _DefaultPackage
我这个挣扎了一段时间为好。 你接近,你只需要在CLASSPATH中包括你的罐子,并通过你的“主”类的限定名作为主要参数为Java。