当前位置: 首页 > 知识库问答 >
问题:

如何从命令行运行Kotlin类?

孙岳
2023-03-14

我知道以前有人问过这个问题,但是那里的信息都没有帮助我。

我的情况是:我无法运行编译后的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

我错过了什么?

共有3个答案

苍宝
2023-03-14

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

查淮晨
2023-03-14

您可以使用< code>kotlinc进行编译,如下所示:

hello.kt运行时hello.jar

然后可以按如下方式运行jar文件:

$java-jar:hello.jar

蒋培
2023-03-14

要运行Kotlin类,实际上是在运行一个特殊的类,该类是在文件级别创建的,包含<code>main()</code>和其他顶级函数(在类或接口之外)。因此,如果您的代码是:

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

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

然后可以通过运行< code>com.my.stuff.AppKt类来执行程序。此名称源自您的文件名,并附加了< code>Kt。您可以通过添加以下以文件为目标的注释来更改该类在文件中的名称:

@file:JvmName("Foo")  

您还可以将main()放入一个带有伴生对象的类中,并使用JvmStatic。因此,您选择的类名是:

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

class MyApp {
    companion object {
        @JvmStatic fun main(args: Array<String>) {
          ...
        }
    }
}

现在您只需运行类< code>com.my.stuff.MyApp

您需要应用程序 JAR 和任何依赖项。对于 Kotlin 特定的 JAR,当在 Maven/Gradle 之外时,您需要一个 Kotlin 发行版,其中包含:

  • kotlin-stdlib.jar(标准库)
  • kotlin-reflect.jar仅当使用静态编程语言反射
  • kotlin-test.jar用于使用静态编程语言断言类的单元测试

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

您还可以使用 Gradle 应用程序插件从 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,并且假设< code>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或其他包管理器安装静态编程语言工具。(在Mac OS X上brew更新;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
 类似资料:
  • 有人能发布详细的分步说明如何安装Saxon(10 HE)以及如何从MacOS(10.13.6)中的命令行运行转换吗? 我已经在我的计算机上安装了Java 我已经下载了SaxonHE10-6J。来自SourceForge的zip文件 根据这里的建议,我放置了saxon-he-10.6。jar位于myUserName/Library/Java/Extensions文件夹中 然后,我打开终端应用程序并根

  • 在阅读了多篇关于这个主题和Gradle手册的文章后,我正在尝试运行下面的代码块。我运行下面的命令并得到以下错误:execCommand==null! 关于我在下面的代码块中做错了什么有什么想法吗?

  • 问题内容: 我很难找到答案。使用普通的Node.JS,您可以使用,CoffeeScript 和ES6具有的任何js文件。我如何使用Typescript进行操作? 我的项目有一个供Webpack / ts- loader使用的工具,用于为浏览器构建一个不错的小捆绑包。不过,在此之前,我需要从控制台运行一个构建步骤,该步骤将使用项目中使用的某些文件来生成模式,但是如果不进行编译,我似乎无法运行单个Ty

  • 我遵循以下指示https://code.visualstudio.com/docs/setup/mac但我没有成功。这就是我进去时发生的事情 我得到了以下信息: 我还查找了以下问题:如何在OSX上从命令行打开Visual Studio代码?,这没用。 我在VSCode中只有一个终端选项,zsh。

  • 问题内容: 到目前为止,我主要使用eclipse。现在,我正在尝试从终端运行Java,但程序包存在问题。 这是我的文件: 我使用编译此代码,然后运行,它给我: 当我删除一切正常。我想念什么? 给出: 问题答案: 您需要在一个目录级别上运行java命令,并以完全合格的软件包名称提供它,例如: 请参阅Java Launcher如何查找用户类 以了解其工作方式。

  • 问题内容: 我开发了OSGi捆绑包,通常通过Eclipse进行测试。在导出捆绑包之后,我得到了bundle.jar文件。我希望能够从命令行运行生成的文件。就像是: C:\ java -jar bundle.jar osgi_framework路径 但是,如何在其中包含osgi框架?而且,如何立即启动捆绑包? 问题答案: 您可以从命令行启动OSGi框架,如下所示。首先是春分: 注意 用VERSION