Vraag Hoe Kotlin-klasse uit te voeren vanaf de opdrachtregel?


Ik begrijp dat deze vraag al eerder is gesteld, maar niets van de informatie daar heeft me geholpen.

Hier is mijn situatie: ik kan geen gecompileerde Kotlin-klasse uitvoeren. Wanneer ik probeer het uit te voeren zoals ik een normale java-klasse zou doen, krijg ik het volgende:

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

Dit bracht me tot de overtuiging dat de Kotlin-runtime gewoonweg miste, gegeven die output. Dus ik probeerde het volgende:

C:\Users\User\Desktop>java -cp kotlin-runtime.jar _DefaultPackage

Error: Could not find or load main class _DefaultPackage

Wat me deed denken dat ik misschien het klassenbestand aan mijn aangegeven klassenpad moest toevoegen, dus:

C:\Users\User\Desktop>java -cp kotlin-runtime.jar';_DefaultPackage.class _DefaultPackage

Error: Could not find or load main class _DefaultPackage

Wat mis ik?


39
2018-02-06 16:10


oorsprong


antwoorden:


De naam van je hoofdklasse kennen

Als u een Kotlin-klasse wilt uitvoeren, voert u in feite een speciale klasse uit die is gemaakt op bestandsniveau waarop u staat main() en andere functies die van het hoogste niveau zijn (buiten een klasse of interface). Dus als je code is:

// file App.kt
package com.my.stuff

fun main(args: Array<String>) {
  ...
}

Vervolgens kunt u het programma uitvoeren door de com.my.stuff.AppKt klasse. Deze naam is afgeleid van uw bestandsnaam met Kt bijgevoegd. U kunt de naam van deze klasse in het bestand wijzigen door dit toe te voegen bestandsgerichte annotatie:

@file:JvmName("Foo")  

Je kunt ook je main() in een klas met een begeleidend object en maak het static de ... gebruiken JvmStatic annotatie. Daarom is je klassenaam degene die je hebt gekozen:

// file App.kt
package com.my.stuff

class MyApp {
    companion object {
        @JvmStatic fun main(args: Array<String>) {
          ...
        }
    }
}

Nu voer je gewoon de klas uit com.my.stuff.MyApp

Welke andere JAR-bestanden heb ik nodig?

U hebt de JAR van uw toepassing en eventuele afhankelijkheden nodig. Voor Kotlin specifieke JARs wanneer je buiten Maven / Gradle bent, heb je een Kotlin-distributie nodig die het volgende bevat:

  • kotlin-stdlib.jar (de standaardbibliotheek)
  • kotlin-reflect.jar alleen bij gebruik van Kotlin-reflectie
  • kotlin-test.jar voor eenheidstests die Kotlin-assertieklassen gebruiken

Rennen vanuit Intellij

Als u in Intellij (als het uw IDE is) kunt klikken met de rechtermuisknop op de main() functie en selecteer Uitvoeren, het maakt een runtime-configuratie voor u aan en toont de volledig gekwalificeerde klassenaam die zal worden gebruikt. Je kunt dat altijd gebruiken als je niet zeker bent van de naam van de gegenereerde klasse.

Rennen vanuit Gradle

U kunt ook de De plug-in Grading Application om een ​​proces vanuit Gradle uit te voeren, of om een ​​uitvoerbaar systeem te maken met een zip / tgz van je JAR en al zijn afhankelijkheden, en een opstartscript. Als u de bovenstaande voorbeeldklasse gebruikt, voegt u deze toe aan uw 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"] 

En dan vanaf het gebruik van de opdrachtregel:

// run the program
gradle run

// debug the program
gradle run --debug-jvm

// create a distribution (distTar, distZip, installDist, ...)
gradle distTar

Rechtstreeks uitgevoerd vanuit de opdrachtregel van Java

Als je een uitvoerbare JAR hebt en ervan uitgaat KOTLIN_LIB verwijst naar een map waarin Kotlin runtime-bibliotheekbestanden zich bevinden:

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

Zie de opmerkingen hierboven over andere JAR-bestanden die u mogelijk nodig hebt. Een kleine variatie als je een uitvoerbare JAR hebt (met de manifest naar com.my.stuff.AppKt als de hoofdklasse):

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

Wordt uitgevoerd met het opdrachtregelprogramma Kotlin

Als u Kotlin-tools via installeert homebrew of een andere pakketbeheerder. (op Mac OS X brew update ; brew install kotlin) Dan is het heel eenvoudig om te draaien:

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

Met deze opdracht wordt de stdlib toegevoegd aan het opgegeven klassenpad en wordt de klasse uitgevoerd. Mogelijk moet u extra Kotlin-bibliotheken toevoegen, zoals vermeld in het gedeelte hierboven "Running from Java."

Het creëren van een uitvoerbare JAR met de Kotlin-compiler

Dit komt niet vaak voor omdat de meeste mensen andere build-tools gebruiken, maar de Kotlin-compiler kan een uitgebreide Jar creëren die dit voor u oplost (zie http://kotlinlang.org/docs/tutorials/command-line.html) wanneer het de runtime en uw code samen bundelt. Hoewel dit niet zo gebruikelijk is bij het gebruik van hulpmiddelen zoals Maven en Gradle of IDE-builds. Voer dan uit met de normale Java:

java -jar MyApp.jar

70
2017-12-29 14:26



Je kunt compileren met kotlinc als volgt:

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

en dan kun je jar-bestand als volgt uitvoeren:

$ java -jar hello.jar


7
2018-05-31 17:05



Probeer te schrijven:

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

bijvoorbeeld:

java -cp kotlin-runtime.jar;. _DefaultPackage

6
2018-02-07 09:39



Ik heb hier ook een tijdje mee geworsteld. Je bent in de buurt, je hoeft alleen je pot op te nemen in het klassenpad en de gekwalificeerde naam van je 'hoofdklasse' door te geven als het primaire argument voor Java.


3
2018-02-07 00:05