Construir un contenedor autoejecutable con Gradle y Kotlin
Escribí un file fuente simple de kotlin para comenzar, y un file de script de Gradle. Pero no puedo descifrar cómo agregar el func principal al manifiesto, para que el contenedor sea autoejecutable.
Aquí mi script build.gradle:
- Deserialization de KS JS JSON
- asignar variable solo si es nulo
- Spring Boot + Kotlin AutoProxyRegistrar causa la exception de Nullpointer
- muchos listview y cada uno contiene diferentes objects en Kotlin
- Kotlin's Iterable y Sequence se ven exactamente igual. ¿Por qué se requieren dos types?
buildscript { repositories { mavenCentral() } dependencies { classpath 'org.jetbrains.kotlin:kotlin-gradle-plugin:0.9.66' } } apply plugin: "kotlin" repositories { mavenCentral() } dependencies { compile 'org.jetbrains.kotlin:kotlin-stdlib:0.9.66' } jar { manifest { attributes 'Main-Class': 'com.loloof64.kotlin.exps.ExpsPackage' } }
Aquí está mi com.loloof64.kotlin.exps.Multideclarations.kt
package com.loloof64.kotlin.exps class Person(val firstName: String, val lastName: String) { fun component1(): String { return firstName } fun component2(): String { return lastName } } fun main(args: Array < String > ) { val(first, last) = Person("Laurent", "Bernabé") println("First name : $first - Last name : $last") }
Cuando ejecuto el jar desde el terminal (java -jar MYJar.jar) obtengo el siguiente stacktrace, diciéndome que faltan las classs de la biblioteca de reflexión kotlin, y de hecho no se han agregado al jarrón. Parece que me faltan las classs de artefactos kotlin-comstackdor del jar final, y también las fonts kotlin-stdlib, pero no sé cómo adaptar la compilation gradle.
$> java -jar build/libs/kotlin_exps.jar Exception in thread "main" java.lang.NoClassDefFoundError: kotlin/reflect/jvm/internal/InternalPackage at com.loloof64.kotlin.exps.ExpsPackage.<clinit>(MultiDeclarations.kt) Caused by: java.lang.ClassNotFoundException: kotlin.reflect.jvm.internal.InternalPackage at java.net.URLClassLoader$1.run(URLClassLoader.java:372) at java.net.URLClassLoader$1.run(URLClassLoader.java:361) at java.security.AccessController.doPrivileged(Native Method) at java.net.URLClassLoader.findClass(URLClassLoader.java:360) at java.lang.ClassLoader.loadClass(ClassLoader.java:424) at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:308) at java.lang.ClassLoader.loadClass(ClassLoader.java:357) ... 1 more
Estoy usando Kotlin 0.9.66 y gradle 2.1
- ¿Cómo puedo saber si un número es una potencia de 10 en Kotlin o Java?
- ¿Es posible restringir el tipo de una Lista a una implementación de una interfaz en Kotlin?
- Apache FOP 2.2 incluye fonts usando ruta relativa
- Cómo depurar el error "No se pudo resolver com.google.android:android" en Anko
- Kotlin con Spring DI: la propiedad lateinit no se ha inicializado
- Verifique lists de objects para igualdad sin control de order en su propiedad Lista
- Kotlin Dagger2 no puede encontrar el símbolo ApplicationModule_ProvideApplicationFactory
- ¿Cómo cambiar un campo de miembro con la reflexión de Kotlin?
Agregue la application
complemento, luego configure mainClassName
como
mainClassName = '[your_namespace].[your_arctifact]Kt'
Por ejemplo, supongamos que ha colocado el siguiente código en un file llamado main.kt
:
package net.mydomain.kotlinlearn import kotlin import java.util.ArrayList fun main(args: Array<String>) { println("Hello!") }
tu build.gradle
debería ser:
apply plugin: 'kotlin' apply plugin: 'application' mainClassName = "net.mydomain.kotlinlearn.MainKt"
De hecho, Kotlin está creando una class para encapsular su function principal nombrada con el mismo nombre de su file, con Title Case.
Encontré la solución (gracias al website de MkYong )
- La secuencia de commands gradle necesitaba el artefacto kotlin-comstackdor como una dependencia
- El script de Gradle necesitaba una forma de recostackr todos los files de kotlin y ponerlos en el contenedor.
Así que me sale con la siguiente secuencia de commands de gradle:
buildscript { repositories { mavenCentral() } dependencies { classpath 'org.jetbrains.kotlin:kotlin-gradle-plugin:1.0.1-2' } } apply plugin: "kotlin" repositories { mavenCentral() } dependencies { compile 'org.jetbrains.kotlin:kotlin-stdlib:1.0.1-2' } jar { manifest { attributes 'Main-Class': 'com.loloof64.kotlin.exps.MultideclarationsKT' } // NEW LINE HERE !!! from { configurations.compile.collect { it.isDirectory() ? it : zipTree(it) } } }
En caso de que seas tonto, como yo:
No cree su configuration de ejecución IntelliJ como una aplicación. IntelliJ asumirá que es Java y nunca funcionará. En cambio, usa la input "Kotlin".
- Kotlin: ¿usar una lambda en lugar de una interfaz funcional?
- ¿Los types de datos de Kotlin están basados en types de datos Java primitivos o no primitivos?