如何从命令行运行Kotlin类?

Jes*_*fon 47 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
Run Code Online (Sandbox Code Playgroud)

这让我相信,考虑到输出,Kotlin运行时只是缺失了.所以我尝试了以下方法:

C:\Users\User\Desktop>java -cp kotlin-runtime.jar _DefaultPackage

Error: Could not find or load main class _DefaultPackage
Run Code Online (Sandbox Code Playgroud)

这让我觉得我可能需要将类文件添加到我声明的类路径中,这样:

C:\Users\User\Desktop>java -cp kotlin-runtime.jar';_DefaultPackage.class _DefaultPackage

Error: Could not find or load main class _DefaultPackage
Run Code Online (Sandbox Code Playgroud)

我错过了什么?

Jay*_*ard 87

知道你的主类的名字

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

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

fun main(args: Array<String>) {
  ...
}
Run Code Online (Sandbox Code Playgroud)

然后,您可以通过运行com.my.stuff.AppKt该类来执行该程序.此名称源自您的文件名并Kt附加.您可以通过添加此文件定位注释来更改文件中此类的名称:

@file:JvmName("Foo")  
Run Code Online (Sandbox Code Playgroud)

您还可以将您main()放入具有伴随对象的类中,并static使用JvmStatic注释进行创建.因此,您的班级名称是您选择的名称:

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

class MyApp {
    companion object {
        @JvmStatic fun main(args: Array<String>) {
          ...
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

现在你就开始上课了 com.my.stuff.MyApp

我需要哪些其他JAR文件?

您需要应用程序JAR和任何依赖项.对于在Maven/Gradle之外的Kotlin特定JAR,您需要一个包含以下内容的Kotlin分布:

  • kotlin-stdlib.jar (标准库)
  • kotlin-reflect.jar 只有使用Kotlin反射
  • kotlin-test.jar 对于使用Kotlin断言类的单元测试

从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 Code Online (Sandbox Code Playgroud)

然后从命令行使用:

// run the program
gradle run

// debug the program
gradle run --debug-jvm

// create a distribution (distTar, distZip, installDist, ...)
gradle distTar
Run Code Online (Sandbox Code Playgroud)

直接从Java命令行运行

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

java -cp $KOTLIN_LIB/kotlin-stdlib.jar:MyApp.jar com.my.stuff.AppKt
Run Code Online (Sandbox Code Playgroud)

请参阅上面有关您可能需要的其他JAR文件的说明.如果您有一个可运行的JAR(将清单指向com.my.stuff.AppKt主类),则会略有不同:

java -cp $KOTLIN_LIB/kotlin-stdlib.jar -jar MyApp.jar
Run Code Online (Sandbox Code Playgroud)

使用Kotlin命令行工具运行

如果您通过Homebrew或其他软件包管理器安装Kotlin工具.(在Mac OS X上brew update ; brew install kotlin)然后运行起来非常简单:

kotlin -cp MyApp.jar com.my.stuff.AppKt
Run Code Online (Sandbox Code Playgroud)

此命令将stdlib添加到提供的类路径,然后运行该类.您可能需要添加其他Kotlin库,如上面的"从Java运行"一节中所述.

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

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

java -jar MyApp.jar
Run Code Online (Sandbox Code Playgroud)

  • 截至一年后,显然有人认为KT中的T不应该是大写的. (4认同)
  • 如果您未在“App.kt”中指定包名称,那么与应用程序插件一起使用的“mainClassName”是什么?(对于 Kotlin 则不需要这样做。) (2认同)

Aks*_*tel 10

您可以使用kotlinc如下编译:

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

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

$ java -jar hello.jar


bas*_*hor 6

试着写:

java -cp <path to kotlin-runtime.jar>;<path to parent dir of _DefaultPackage.class> _DefaultPackage
Run Code Online (Sandbox Code Playgroud)

例如:

java -cp kotlin-runtime.jar;. _DefaultPackage
Run Code Online (Sandbox Code Playgroud)


ajs*_*vig 5

我也为此苦苦挣扎了一段时间。很接近了,您只需要将 jar 包含在类路径中,并将“主”类的限定名称作为主要参数传递给 java.lang.