kotlin - 使用 Gradle 和 Kotlin 构建自执行 JAR

为了入门,我编写了一个简单的 Kotlin 源文件,以及一个 Gradle 脚本文件。 但我不知道如何将 main 函数添加到 list 中,以便 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")
}

当我从终端 (java -jar MYJar.jar) 启动 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。

最佳答案

添加插件application,然后设置mainClassName

mainClassName = '[your_namespace].[your_arctifact]Kt'

例如,假设您将以下代码放在名为 main.kt 的文件中:

package net.mydomain.kotlinlearn

import kotlin
import java.util.ArrayList

fun main(args: Array<String>) {

    println("Hello!")

}

你的 build.gradle 应该是:

apply plugin: 'kotlin'
apply plugin: 'application'

mainClassName = "net.mydomain.kotlinlearn.MainKt"

事实上,Kotlin 正在构建一个类来封装你的 main 函数,该函数与你的文件同名 - 使用 Title Case。

https://stackoverflow.com/questions/26469365/

相关文章:

android - 无法使用 Android Studio 3.0 + DataBinding +

android - Kotlin Coroutines 在 Android 中的正确方式

kotlin - 实现Java接口(interface)时如何克服 "same JVM signat

javascript - Kotlin JavaScript 到 TypeScript 定义文件

gradle - 如何将 Gradle 项目中 Kotlin 的字节码版本设置为 Java 8?

interface - 如何创建接口(interface)的匿名实现?

kotlin - 意外覆盖 : The following declarations have th

android - IllegalArgumentException : Parameter spe

kotlin - Kotlin 中的扩展字段

arrays - Kotlin中数据类的equals方法