68

私はこの質問が以前に尋ねられたことを理解していますが、そこにある情報のどれも私を助けませんでした。

これが私の状況です:コンパイルされた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

私は何が欠けていますか?

4

4 に答える 4

126

あなたのメインクラスの名前を知る

Kotlinクラスを実行するには、実際には、ファイルレベルで作成された特別なクラスを実行していますmain()。このクラスは、トップレベル(クラスまたはインターフェイスの外部)にある他の関数を保持します。したがって、コードが次の場合:

// 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と依存関係が必要です。Maven / Gradleの外部にあるKotlin固有のJARの場合、以下を含むKotlinディストリビューションが必要です。

  • kotlin-stdlib.jar(標準ライブラリ)
  • kotlin-reflect.jarKotlinリフレクションを使用する場合のみ
  • kotlin-test.jarKotlinアサーションクラスを使用する単体テストの場合

Intellijから実行

Intellij(IDEの場合)でmain()関数を右クリックして[実行]を選択すると、ランタイム構成が作成され、使用される完全修飾クラス名が表示されます。生成されたクラスの名前がわからない場合は、いつでもこれを使用できます。

Gradleから実行

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

Javaコマンドラインから直接実行

実行可能なJARがあり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

Kotlinコマンドラインツールを使用して実行する

Homebrewまたは他のパッケージマネージャーを介してKotlinツールをインストールする場合。(Mac OS Xのbrew update ; brew install kotlin場合)次に、実行は非常に簡単です。

kotlin -cp MyApp.jar com.my.stuff.AppKt

このコマンドは、指定されたクラスパスにstdlibを追加してから、クラスを実行します。上記の「Javaからの実行」のセクションで説明したように、Kotlinライブラリを追加する必要がある場合があります。

Kotlinコンパイラを使用した実行可能なJARの作成

ほとんどの人が他のビルドツールを使用するため、これはあまり一般的ではありませんが、Kotlinコンパイラは、バンドル時にこれを解決する実行可能なJarを作成できます(http://kotlinlang.org/docs/tutorials/command-line.htmlを参照)。ランタイムとコードを一緒に。これは、MavenやGradleなどのツール、またはIDEビルドを使用する場合ほど一般的ではありませんが。次に、通常のJavaを使用して実行します。

java -jar MyApp.jar
于 2015-12-29T14:26:42.680 に答える
16

kotlinc次のように使用してコンパイルできます。

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

次に、次のようにjarファイルを実行できます。

$ java -jar hello.jar

于 2017-05-31T17:05:31.430 に答える
4

私もしばらくこれに苦労しました。あなたは近くにいます、あなたはただあなたのjarをクラスパスに含めて、あなたの「メイン」クラスの修飾された名前をjavaへの主要な引数として渡す必要があります。

于 2013-02-07T00:05:00.580 に答える
1

main.ktプロジェクトを実行しようとするときは、自分と同じフォルダーにいない可能性があることを考慮することが重要です。また、 Kotlin(またはJava)にプロジェクトを見つけるように指示する方法が常に明確であるとは限りません。

仮定して:

  • Windowsのコマンドプロンプトからコンパイルして実行しようとしています。
  • このプロジェクト構造があります(IntelliJ IdeaがコマンドラインKotlinプロジェクトをセットアップした後):
MyNiftyProject
  src
    main
      kotlin
        main.kt
  • あなたはプロジェクトルートにいます。
  • そして、あなたはこのmain.ktファイルを持っています:
fun main(args: Array<String>) {
    println("Hello World!")
}

このようにコンパイルします。

kotlinc src/main/kotlin/main.kt -include-runtime -d MyNiftyProject.jar

これにより、プロジェクトMyNiftyProject.jarルートになります。

次に、javaコマンドラインツールを使用して次のように実行します。

java -jar MyNiftyProject.jar

または、kotlinコマンドラインツールを使用して次のように実行します。

kotlin -classpath MyNiftyProject.jar MainKt
于 2021-09-02T12:45:08.830 に答える