如何从命令行运行科特林级?(How to run Kotlin class from the com

2019-07-19 10:33发布

我理解这个问题已经被问过,但没有任何信息有帮助了我。

这里是我的情况:我不能运行编译科特林类。 当我尝试像我一个普通的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

我在想什么?

Answer 1:

认识你的主类的名称

要运行科特林类,你实际上是运行握住你是在文件级别创建一类特殊的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


Answer 2:

你可以编译使用kotlinc如下:

$ kotlinc hello.kt -include-运行-d hello.jar

然后你就可以运行如下jar文件:

$ Java的罐子hello.jar



Answer 3:

试着写:

java -cp <path to kotlin-runtime.jar>;<path to parent dir of _DefaultPackage.class> _DefaultPackage

例如:

java -cp kotlin-runtime.jar;. _DefaultPackage


Answer 4:

我这个挣扎了一段时间为好。 你接近,你只需要在CLASSPATH中包括你的罐子,并通过你的“主”类的限定名作为主要参数为Java。



文章来源: How to run Kotlin class from the command line?
标签: kotlin