如何在Kotlin中运行已编译的类文件?

时间:2012-02-20 03:01:18

标签: kotlin

Jetbrains提供some documentation,但我找不到如何运行Kotlin的编译类文件。

hello.kt:

fun main(args : Array<String>) {
  println("Hello, world!")
}

编译:

$ kotlinc -out dist -src hello.kt
$ ls dist
namespace.class
$ java dist/namespace
Exception in thread "main" java.lang.NoClassDefFoundError: dist/namespace (wrong name: namespace)
$ java -jar /usr/local/kotlin/lib/kotlin-runtime.jar
Failed to load Main-Class manifest attribute from
/usr/local/kotlin/lib/kotlin-runtime.jar 

如何运行Kotlin程序?

5 个答案:

答案 0 :(得分:43)

了解主要班级的名称

目前(K14从M14开始,包括高达1.0测试版),要运行Kotlin类,您实际上正在运行一个特殊类,该类在文件级别创建,用于保存您的main()和其他顶级函数(在类或接口之外)。所以,如果你的代码是:

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

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

然后您可以通过运行com.my.stuff.AppKt类来执行该程序。此名称源自您的文件名,其中附加了Kt(之前的版本附加了KT,但是后来的beta版本为1.0 Kt)。您可以通过添加此file-targeted annotation

来更改文件中此类的名称
@file:JvmName("MyApp")  

或者您也可以将main()放入带有伴随对象的班级,并使用static注释将其设为JvmStatic。因此,您的班级名称是您选择的名称:

// 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和任何依赖项。对于Kotlin特定的JAR,当你在Maven / Gradle之外时,你需要一个包含以下内容的Kotlin发行版:

  • kotlin-runtime.jar(合并运行时和stdlib)
  • kotlin-reflect.jar仅限于使用Kotlin反射
  • kotlin-test.jar用于使用Kotlin断言类的单元测试

在Maven / Gradle中,目前还有一个单独的kotlin-stdlib.jar

从Intellij

运行

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

从Gradle

运行

您还可以使用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

直接从Java命令行

运行

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

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

请参阅上面有关您可能需要的其他JAR文件的说明。如果您有一个可运行的JAR(将清单指向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库,如上面的部分所述&#34;从Java运行。&#34;

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

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

运行
java -jar MyApp.jar

答案 1 :(得分:5)

我们遇到了同一个程序并在此处发布了我们的解决方案:http://blog.ocheyedan.net/blog/2012/02/19/running-kotlin-code/

基本上你只需要用-cp和'namespace'的主类来调用java。根据您的问题,java调用看起来像这样:

java -cp /usr/local/kotlin/lib/kotlin-runtime.jar:dist/namespace.class namespace

答案 2 :(得分:2)

更新:在较新版本的Kotlin IDE插件中,您可以在“编辑器”弹出菜单中使用上下文“运行 - 操作”。

如果您在IDE中,请右键单击编辑器并选择&#34;运行命名空间&#34; 否则,编译并运行* .namespace类作为普通的Java类。

答案 3 :(得分:0)

我正在运行像这样使用kotlin的jar

java -cp target/idea_test-1.0-SNAPSHOT.jar:lib/kotlin-runtime.jar testing.first seyfer

你好seyfer 种子!

答案 4 :(得分:0)

docs给出了一个简洁明了的答案:

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

java -jar hello.jar

koclinc位于IntelliJ IDEA目录中 在IntelliJ\plugins\Kotlin\kotlinc\bin下 如果您运行的是Windows,请使用kotlinc-jvm.bat