我已經編寫了一個簡單的kotlin源文件以便開始使用,並且還有一個gradle腳本文件。 但我不知道如何將主func添加到清單,以便該jar可以自我執行。用Gradle和Kotlin構建一個可自行執行的jar
這裏我的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'
}
}
這裏是我的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")
}
當我啓動從終端的jar(Java的罐子MYJar.jar)我得到了下面的堆棧跟蹤,告訴我kotlin反射庫類缺失,並且確實沒有添加到jar中。似乎我錯過了最後一個罐子裏的kotlin編譯器工件類,還有kotlin-stdlib源,但我不知道如何調整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
我使用科特林0.9.66和gradle這個2.1
請注意,Kotlin爲諸如'main'等頂級函數生成的類名是在同一個文件中定義的包,以及附加了'KT'的文件名。在你的情況下,這將是'com.loloof64.kotlin.exps.MultideclarationsKT'。您可以通過在文件頂部添加'@file:JvmName(「OtherName」)'來爲文件中的所有頂級函數定義一個新的類名,從而改變這種行爲。 – 2015-12-31 00:57:42