Come eseguire la class Kotlin dalla riga di comando?

Capisco che questa domanda sia stata posta in precedenza, ma nessuna delle informazioni che ci sono state mi ha aiutato.

Ecco la mia situazione: non posso eseguire una class Kotlin compilata. Quando provo ad eseguirlo come se fosse una normale class java ottengo il seguente:

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 

Questo mi ha portato a credere che il runtime di Kotlin fosse semplicemente mancante, dato che l’output. Così ho provato il seguente:

 C:\Users\User\Desktop>java -cp kotlin-runtime.jar _DefaultPackage Error: Could not find or load main class _DefaultPackage 

Il che mi ha fatto pensare che forse avevo bisogno di aggiungere il file di class al mio classpath dichiarato così:

 C:\Users\User\Desktop>java -cp kotlin-runtime.jar';_DefaultPackage.class _DefaultPackage Error: Could not find or load main class _DefaultPackage 

Cosa mi manca?

Conoscere il nome della tua class principale

Per eseguire una class Kotlin, in realtà stai eseguendo una class speciale che viene creata a livello di file che contiene la tua main() e altre funzioni di livello superiore (al di fuori di una class o di un’interfaccia). Quindi se il tuo codice è:

 // file App.kt package com.my.stuff fun main(args: Array) { ... } 

Quindi è ansible eseguire il programma eseguendo la class com.my.stuff.AppKt . Questo nome deriva dal tuo nome file con Kt aggiunto. Puoi modificare il nome di questa class all’interno del file aggiungendo questa annotazione mirata ai file :

 @file:JvmName("Foo") 

Puoi anche mettere il main() in una class con un object companion e renderlo static usando l’annotazione JvmStatic . Quindi il tuo nome di class è quello che hai scelto:

 // file App.kt package com.my.stuff class MyApp { companion object { @JvmStatic fun main(args: Array) { ... } } } 

Ora esegui semplicemente la class com.my.stuff.MyApp

Quali altri file JAR ho bisogno?

È necessario il JAR dell’applicazione e qualsiasi dipendenza. Per i JAR specifici di Kotlin quando sei fuori da Maven / Gradle hai bisogno di una distribuzione di Kotlin che contenga:

  • kotlin-stdlib.jar (la libreria standard)
  • kotlin-reflect.jar solo se si utilizza il riflesso di Kotlin
  • kotlin-test.jar per le unit test che usano le classi di asserzione di Kotlin

Correre da Intellij

Se in Intellij (se è il tuo IDE) puoi fare clic con il tasto destro del mouse sulla funzione main() e selezionare Esegui, creerà una configurazione di runtime per te e mostrerà il nome completo della class che verrà utilizzato. Puoi sempre usarlo se non sei sicuro del nome della class generata.

Correre da Gradle

Puoi anche usare il plugin Gradle Application per eseguire un processo da Gradle, o per creare un sistema eseguibile che include un file zip / tgz del tuo JAR e tutte le sue dipendenze e uno script di avvio. Usando la class di esempio sopra, dovresti aggiungerla al tuo 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"] 

E poi dall’uso della riga di comando:

 // run the program gradle run // debug the program gradle run --debug-jvm // create a distribution (distTar, distZip, installDist, ...) gradle distTar 

Esecuzione diretta da riga di comando di Java

Se si dispone di un JAR eseguibile e si presuppone che KOTLIN_LIB punti a una directory in cui risiedono i file della libreria di runtime di Kotlin:

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

Vedere le note sopra relative ad altri file JAR che potrebbero essere necessari. Una leggera variazione se si dispone di un JAR eseguibile (con il manifest che punta a com.my.stuff.AppKt come class principale):

 java -cp $KOTLIN_LIB/kotlin-stdlib.jar -jar MyApp.jar 

Esecuzione usando lo strumento da riga di comando di Kotlin

Se installi gli strumenti di Kotlin tramite Homebrew o un altro gestore di pacchetti. (su Mac OS X brew update ; brew install kotlin ) Quindi è molto semplice da eseguire:

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

Questo comando aggiunge lo stdlib al classpath fornito, quindi esegue la class. Potrebbe essere necessario aggiungere ulteriori librerie Kotlin come menzionato nella sezione precedente “Esecuzione da Java”.

Creazione di JAR eseguibili con il compilatore Kotlin

Questo non è molto comune dato che molte persone usano altri strumenti di compilazione, ma il compilatore Kotlin può creare un Jar eseguibile che risolve questo problema per te (vedi http://kotlinlang.org/docs/tutorials/command-line.html ) quando raggruppa il runtime e il tuo codice insieme. Anche se questo non è così comune quando si usano strumenti come Maven e Gradle o build IDE. Quindi eseguire utilizzando il normale Java:

 java -jar MyApp.jar 

Puoi compilare usando kotlinc come segue:

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

e quindi puoi eseguire il file jar come segue:

$ java -jar hello.jar

Prova a scrivere:

 java -cp ; _DefaultPackage 

per esempio:

 java -cp kotlin-runtime.jar;. _DefaultPackage 

Ho lottato anche con questo per un po ‘. Sei vicino, devi solo includere il tuo jar nel classpath e passare il nome qualificato della tua class “main” come argomento principale di java.