Как запустить класс Kotlin из командной строки?

Я понимаю, что этот вопрос задавали раньше, но ни одна из информации там не помогла мне.

Вот моя ситуация: я не могу запустить скомпилированный класс 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 

Что мне не хватает?

Знание имени вашего основного класса

Чтобы запустить класс Kotlin, на самом деле вы запускаете специальный класс, созданный на уровне файла, на котором хранятся ваши main() и другие функции верхнего уровня (вне класса или интерфейса). Поэтому, если ваш код:

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

Затем вы можете выполнить программу, запустив класс com.my.stuff.AppKt . Это имя происходит от вашего имени файла с добавленным Kt . Вы можете изменить имя этого класса в файле, добавив эту аннотацию, ориентированную на файл :

 @file:JvmName("Foo") 

Вы также можете поместить свой main() в класс со своим сопутствующим объектом и сделать его static используя аннотацию JvmStatic . Поэтому ваше имя класса – это тот, который вы выбрали:

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

Теперь вы просто запускаете класс com.my.stuff.MyApp

Какие еще файлы JAR мне нужны?

Вам нужно приложение JAR и любые зависимости. Для Kotlin конкретных JARs, когда за пределами Maven / Gradle вам нужно распределение Kotlin, которое содержит:

  • kotlin-stdlib.jar (стандартная библиотека)
  • kotlin-reflect.jar только при использовании отражения Котлина
  • kotlin-test.jar для модульных тестов, которые используют классы утверждения Котлина

Запуск из Intellij

Если в Intellij (если это ваша IDE) вы можете щелкнуть правой кнопкой мыши по функции main() и выбрать «Выполнить», она создаст для вас конфигурацию времени выполнения и покажет полное имя класса, которое будет использоваться. Вы всегда можете использовать это, если не уверены в имени сгенерированного класса.

Бег из Грейдл

Вы также можете использовать плагин Gradle Application для запуска процесса с Gradle или для создания управляемой системы, включающей zip / tgz вашего JAR и всех его зависимостей, а также сценарий запуска. Используя вышеприведенный класс, вы должны добавить это в свой 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

Если у вас есть runnable JAR и предполагается, что KOTLIN_LIB указывает на каталог, в котором KOTLIN_LIB файлы библиотеки времени исполнения Kotlin:

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

См. Примечания выше о других файлах JAR, которые могут вам понадобиться. Небольшое изменение, если у вас есть runnable JAR (с манифестом, указывающим на com.my.stuff.AppKt в качестве основного класса):

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

Запуск с использованием инструмента командной строки Kotlin

Если вы устанавливаете инструменты Kotlin через Homebrew или другой менеджер пакетов. (в Mac OS X brew update ; brew install kotlin ). Тогда это очень просто запустить:

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

Эта команда добавляет stdlib в предоставленный classpath, а затем запускает класс. Возможно, вам придется добавить дополнительные библиотеки Kotlin, как указано в разделе выше «Работа с Java».

Создание исполняемого JAR с помощью компилятора Kotlin

Это не очень часто, так как большинство людей используют другие инструменты сборки, но компилятор Kotlin может создать runnable Jar, который решает это для вас (см. http://kotlinlang.org/docs/tutorials/command-line.html ), когда он связывает время выполнения и ваш код вместе. Хотя это не так часто встречается при использовании таких инструментов, как Maven и Gradle, или сборки IDE. Затем выполните обычную Java:

 java -jar MyApp.jar 

Попробуйте написать:

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

например:

 java -cp kotlin-runtime.jar;. _DefaultPackage 

Вы можете компилировать с использованием kotlinc следующим образом:

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

и затем вы можете запустить файл jar следующим образом:

$ java -jar hello.jar

Некоторое время я боролся с этим. Вы близки, вам просто нужно включить свою банку в путь класса и передать квалифицированное имя вашего «основного» класса в качестве основного аргумента в java.