Подтвердить что ты не робот

Как запустить класс 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

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

4b9b3361

Ответ 1

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

Чтобы запустить класс 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 вашего приложения и любые зависимости. Для JAR, специфичных для Kotlin, за пределами Maven/Gradle вам нужен дистрибутив Kotlin, который содержит:

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

Бег от Интеллидж

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

Работает от Gradle

Вы также можете использовать плагин 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

Если у вас есть исполняемый 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

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

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

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

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

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

java -jar MyApp.jar

Ответ 2

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

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

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

$java -jar hello.jar

Ответ 3

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

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

например:

java -cp kotlin-runtime.jar;. _DefaultPackage

Ответ 4

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

Ответ 5

Как ни странно, просто создание нового класса fike (убедившись, что это файл класса Kotlin, а не просто новый файл), работало хорошо? Думаю, я должен также отметить, что я удостоверился, что вставил файл класса kotlin в автоматически сгенерированную папку 'src' вне ее. Надеюсь, это поможет кому-то :)