supports - Construyendo un tarro autoejecutable con Gradle y Kotlin.
kotlin-stdlib-jre7 is deprecated. please use kotlin-stdlib-jdk7 instead (4)
He escrito un simple archivo fuente de Kotlin para comenzar, y un archivo 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:
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 lanzo el jar desde la terminal (java -jar MYJar.jar) obtengo el siguiente stacktrace, diciéndome que faltan las clases de la biblioteca de reflexión de kotlin y que, de hecho, no se han agregado al jar. Parece que me faltan las clases de artefactos del compilador kotlin del archivo final, y también las fuentes kotlin-stdlib, pero no sé cómo adaptar la compilación de 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
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 archivo llamado main.kt
:
package net.mydomain.kotlinlearn
import kotlin
import java.util.ArrayList
fun main(args: Array<String>) {
println("Hello!")
}
su build.gradle
debe ser:
apply plugin: ''kotlin''
apply plugin: ''application''
mainClassName = "net.mydomain.kotlinlearn.MainKt"
De hecho, Kotlin está creando una clase para encapsular su función principal nombrada con el mismo nombre de su archivo, con Title Case.
En caso de que seas tonto, como yo:
No cree su configuración de ejecución IntelliJ como una aplicación. IntelliJ asumirá que es Java y nunca funcionará. En cambio, usa la entrada "Kotlin".
Gracias, para mí funcionó agregar la sección jar
jar {
manifest {
attributes ''Main-Class'': ''com.photofiles.Application''
}
from { configurations.compile.collect { it.isDirectory() ? it : zipTree(it) } }
}
No es necesario el complemento de aplicación.
He encontrado la solución (gracias al sitio web MkYong )
- El script de gradle necesitaba el artefacto compilador kotlin como una dependencia
- El script de gradle necesitaba una forma de recopilar todos los archivos kotlin y colocarlos en el jar.
Así que consigo con el siguiente script 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) } }
}