Comment exécuter la classe Kotlin à partir de la ligne de commande?

Je comprends que cette question a déjà été posée, mais aucune des informations ne m’a aidé.

Voici ma situation: je ne peux pas exécuter une classe Kotlin compilée. Lorsque j’essaie de l’exécuter comme je le ferais avec une classe Java normale, j’obtiens les éléments suivants:

C:\Users\User\Desktop>java _DefaultPackage Exception in thread "main" java.lang.NoClassDefFoundError: jet/runtime/Insortingnsics at _DefaultPackage.main(Finder.kt) Caused by: java.lang.ClassNotFoundException: jet.runtime.Insortingnsics 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 

Cela m’a amené à croire que l’exécution de Kotlin manquait simplement, compte tenu de cette sortie. J’ai donc essayé ce qui suit:

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

Ce qui m’a fait penser que je devais peut-être append le fichier de classe à mon classpath déclaré pour:

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

Qu’est-ce que je rate?

Connaître le nom de votre classe principale

Pour exécuter une classe Kotlin, vous exécutez en fait une classe spéciale créée au niveau du fichier qui contient votre main() et d’autres fonctions de niveau supérieur (en dehors d’une classe ou d’une interface). Donc, si votre code est:

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

Ensuite, vous pouvez exécuter le programme en exécutant la classe com.my.stuff.AppKt . Ce nom est dérivé de votre nom de fichier avec Kt ajouté. Vous pouvez modifier le nom de cette classe dans le fichier en ajoutant cette annotation ciblée par fichier :

 @file:JvmName("Foo") 

Vous pouvez également placer votre main() dans une classe avec un object compagnon et le rendre static à l’aide de l’annotation JvmStatic . Votre nom de classe est donc celui que vous avez choisi:

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

Maintenant, il vous suffit d’exécuter la classe com.my.stuff.MyApp

De quels autres fichiers JAR ai-je besoin?

Vous avez besoin de votre application JAR et de toutes les dépendances. Pour les JAR spécifiques à Kotlin, lorsque vous êtes en dehors de Maven / Gradle, vous avez besoin d’une dissortingbution Kotlin contenant:

  • kotlin-stdlib.jar (la bibliothèque standard)
  • kotlin-reflect.jar uniquement si vous utilisez la reflection Kotlin
  • kotlin-test.jar pour les tests unitaires utilisant les classes d’assertion Kotlin

En cours d’exécution à partir d’Intellij

Si dans Intellij (si c’est votre IDE) vous pouvez faire un clic droit sur la fonction main() et sélectionner Exécuter, cela créera une configuration d’exécution pour vous et affichera le nom de classe complet qui sera utilisé. Vous pouvez toujours l’utiliser si vous n’êtes pas certain du nom de la classe générée.

Courir de Gradle

Vous pouvez également utiliser le plug-in Gradle Application pour exécuter un processus à partir de Gradle ou pour créer un système exécutable comprenant un zip / tgz de votre JAR et toutes ses dépendances, ainsi qu’un script de démarrage. En utilisant la classe d’exemple ci-dessus, vous appendiez ceci à votre build.gradle :

 apply plugin: 'application' mainClassName = 'com.my.stuff.AppKt' // optional: add one ssortingng per argument you want as the default JVM args applicationDefaultJvmArgs = ["-Xms512m", "-Xmx1g"] 

Et puis à partir de la ligne de commande, utilisez:

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

Exécution directe à partir de la ligne de commande Java

Si vous avez un fichier JAR KOTLIN_LIB et que KOTLIN_LIB à un répertoire contenant des fichiers de bibliothèque d’exécution Kotlin:

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

Voir les notes ci-dessus sur les autres fichiers JAR dont vous pourriez avoir besoin. Une légère variation si vous avez un JAR exécutable (avec le manifeste pointant vers com.my.stuff.AppKt comme classe principale):

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

Exécution à l’aide de l’outil de ligne de commande Kotlin

Si vous installez les outils Kotlin via Homebrew ou un autre gestionnaire de paquets. (sur la brew update ; brew install kotlin Mac OS X brew update ; brew install kotlin ) Ensuite, c’est très simple à exécuter:

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

Cette commande ajoute le stdlib au classpath fourni, puis exécute la classe. Vous devrez peut-être append des bibliothèques Kotlin supplémentaires, comme indiqué dans la section ci-dessus “Exécution à partir de Java”.

Créer un JAR exécutable avec le compilateur Kotlin

Ce n’est pas très courant car la plupart des gens utilisent d’autres outils de construction, mais le compilateur Kotlin peut créer un Jar exécutable qui résout ce problème pour vous (voir http://kotlinlang.org/docs/tutorials/command-line.html ) lorsqu’il regroupe le runtime et votre code ensemble. Bien que cela ne soit pas aussi courant lorsque vous utilisez des outils tels que Maven et Gradle, ou des versions IDE. Ensuite, exécutez en utilisant le Java normal:

 java -jar MyApp.jar 

Vous pouvez comstackr en utilisant kotlinc comme suit:

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

et puis vous pouvez exécuter le fichier jar comme suit:

$ java -jar hello.jar

Essayez d’écrire:

 java -cp ; _DefaultPackage 

par exemple:

 java -cp kotlin-runtime.jar;. _DefaultPackage 

J’ai lutté avec cela pendant un moment aussi. Vous êtes proche, il vous suffit d’inclure votre jar dans le classpath et de passer le nom qualifié de votre classe “main” en tant qu’argument principal de java.