我写了一个简单的 Kotlin 源代码文件和 Gradle 脚本文件来开始我的项目。但是我不知道如何将主函数添加到清单文件中,以便 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 -jar MYJar.jar
)时,会看到以下堆栈跟踪信息,说明缺少Kotlin反射库的类,而它们确实没有被添加到JAR中。似乎我在最终的JAR文件中缺少kotlin-compiler构件的类,以及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
我正在使用 Kotlin 0.9.66 和 Gradle 2.1。
main
)生成的类名是在同一文件中定义的包加上附加了KT
的文件名。在您的情况下,这将是com.loloof64.kotlin.exps.MultideclarationsKT
。您可以通过在文件顶部添加@file:JvmName("OtherName")
来更改此行为,以为文件中的所有顶层函数定义一个新的类名。 - Jayson MinardKt
而不是KT
... 即大写字母 K 和小写字母 t。这是一个容易犯的错误,但会导致 jar 执行失败。我自己有时也会因为打字不完美而遇到这个问题。 - J.E.Tkaczyk