objetos - kotlin herencia
¿Cómo ejecutar la clase Kotlin desde la línea de comandos? (4)
Entiendo que esta pregunta se ha hecho antes, pero ninguna de la información me ha ayudado.
Aquí está mi situación: no puedo ejecutar una clase compilada de Kotlin. Cuando intento ejecutarlo como si fuera una clase java normal, obtengo lo siguiente:
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
Esto me llevó a creer que el tiempo de ejecución de Kotlin simplemente faltaba, dada esa salida. Así que intenté lo siguiente:
C:/Users/User/Desktop>java -cp kotlin-runtime.jar _DefaultPackage
Error: Could not find or load main class _DefaultPackage
Lo que me hizo pensar que tal vez necesitaba agregar el archivo de clase a mi classpath declarado, así que:
C:/Users/User/Desktop>java -cp kotlin-runtime.jar'';_DefaultPackage.class _DefaultPackage
Error: Could not find or load main class _DefaultPackage
¿Qué me estoy perdiendo?
Saber el nombre de su clase principal
Para ejecutar una clase Kotlin, en realidad está ejecutando una clase especial que se crea a nivel de archivo que contiene su main()
y otras funciones que son de nivel superior (fuera de una clase o interfaz). Así que si tu código es:
// file App.kt
package com.my.stuff
fun main(args: Array<String>) {
...
}
Luego puedes ejecutar el programa ejecutando la clase com.my.stuff.AppKt
. Este nombre se deriva de su nombre de archivo con Kt
anexado. Puede cambiar el nombre de esta clase dentro del archivo agregando esta anotación dirigida al archivo :
@file:JvmName("Foo")
También puede colocar su main()
en una clase con un objeto complementario y hacerlo static
usando la anotación JvmStatic
. Por lo tanto, su nombre de clase es el que eligió:
// file App.kt
package com.my.stuff
class MyApp {
companion object {
@JvmStatic fun main(args: Array<String>) {
...
}
}
}
Ahora solo ejecuta la clase com.my.stuff.MyApp
¿Qué otros archivos JAR necesito?
Necesitas tu aplicación JAR y cualquier dependencia. Para JARs específicos de Kotlin cuando se encuentra fuera de Maven / Gradle, necesita una distribución de Kotlin que contenga:
-
kotlin-stdlib.jar
(la biblioteca estándar) -
kotlin-reflect.jar
solo si se utiliza la reflexión de Kotlin -
kotlin-test.jar
para pruebas unitarias que usan clases de aserción de Kotlin
Corriendo desde Intellij
Si en Intellij (si es su IDE) puede hacer clic derecho en la función main()
y seleccionar Ejecutar, creará una configuración de tiempo de ejecución para usted y mostrará el nombre de clase completo que se usará. Siempre puede usar eso si no está seguro del nombre de la clase generada.
Corriendo desde Gradle
También puede usar el complemento de la aplicación Gradle para ejecutar un proceso desde Gradle, o para crear un sistema ejecutable que incluya un zip / tgz de su JAR y todas sus dependencias, y un script de inicio. Usando la clase de ejemplo anterior, agregaría esto a su 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"]
Y luego desde la línea de comandos usar:
// run the program
gradle run
// debug the program
gradle run --debug-jvm
// create a distribution (distTar, distZip, installDist, ...)
gradle distTar
Ejecutar directamente desde la línea de comandos de Java
Si tiene un JAR ejecutable, y suponiendo que KOTLIN_LIB
apunta a un directorio donde residen los archivos de la biblioteca en tiempo de ejecución de Kotlin:
java -cp $KOTLIN_LIB/kotlin-stdlib.jar:MyApp.jar com.my.stuff.AppKt
Consulte las notas anteriores sobre otros archivos JAR que pueda necesitar. Una pequeña variación si tiene un JAR ejecutable (con el manifiesto que apunta a com.my.stuff.AppKt
como la clase principal):
java -cp $KOTLIN_LIB/kotlin-stdlib.jar -jar MyApp.jar
Ejecutar utilizando la herramienta de línea de comandos Kotlin
Si instala las herramientas de Kotlin a través de Homebrew u otro administrador de paquetes. (en Mac OS X brew update ; brew install kotlin
) Entonces es muy simple de ejecutar:
kotlin -cp MyApp.jar com.my.stuff.AppKt
Este comando agrega el stdlib al classpath proporcionado, luego ejecuta la clase. Es posible que deba agregar bibliotecas Kotlin adicionales como se menciona en la sección anterior "Ejecución desde Java".
Creación de JAR ejecutable con el compilador Kotlin
Esto no es muy común ya que la mayoría de la gente usa otras herramientas de compilación, pero el compilador Kotlin puede crear un Jar ejecutable que resuelve esto por usted (consulte http://kotlinlang.org/docs/tutorials/command-line.html ) cuando se agrupa El tiempo de ejecución y su código juntos. Aunque esto no es tan común cuando se usan herramientas como Maven y Gradle, o compilaciones IDE. A continuación, ejecute utilizando el Java normal:
java -jar MyApp.jar
Intenta escribir:
java -cp <path to kotlin-runtime.jar>;<path to parent dir of _DefaultPackage.class> _DefaultPackage
por ejemplo:
java -cp kotlin-runtime.jar;. _DefaultPackage
Luché con esto por un tiempo también. Estás cerca, solo necesitas incluir tu jar en el classpath y pasar el nombre calificado de tu clase "principal" como el argumento principal de java.
Puedes compilar usando kotlinc
siguiente manera:
$ kotlinc hello.kt -include-runtime -d hello.jar
y luego puede ejecutar el archivo jar de la siguiente manera:
$ java -jar hello.jar