Kotlin程序错误:jar文件中没有主清单属性

cigdeys3  于 2022-11-16  发布在  Kotlin
关注(0)|答案(2)|浏览(213)

我写了一个简单的Kotlin程序helloworld。

fun main(args: Array<String>) {
    println("Hello, World!")
}

然后我用kotlinc编译它

$kotlinc hello.kt -include-runtime -d hello.jar

没有错误,并且生成了hello.jar。当我运行它时

$java -jar hello.jar

它说hello.jar中没有主清单属性

$no main manifest attribute, in hello.jar

这个问题我想不通,我的Kotlin版本是1.3.40,JDK版本是1.8.0

hi3rlvi2

hi3rlvi21#

我来accross这个答案,而有同样的问题与Kotlin和gradle。我想包让jar工作,但不断起球错误。
对于包含代码的com.example.helloworld.kt这样的文件:

fun main(args: Array<String>) {
    println("Hello, World!")
}

下面是build.gradle.kts文件的样子,让您开始使用gradle。

import org.gradle.kotlin.dsl.*
import org.jetbrains.kotlin.gradle.tasks.KotlinCompile

plugins {
  application
  kotlin("jvm") version "1.3.50"
}

// Notice the "Kt" in the end, meaning the main is not in the class
application.mainClassName = "com.example.MainKt"

dependencies {
  compile(kotlin("stdlib-jdk8"))
}

tasks.withType<KotlinCompile> {
  kotlinOptions.jvmTarget = "1.8"
}

tasks.withType<Jar> {
    // Otherwise you'll get a "No main manifest attribute" error
    manifest {
        attributes["Main-Class"] = "com.example.MainKt"
    }
    
    // To avoid the duplicate handling strategy error
    duplicatesStrategy = DuplicatesStrategy.EXCLUDE

    // To add all of the dependencies otherwise a "NoClassDefFoundError" error
    from(sourceSets.main.get().output)

    dependsOn(configurations.runtimeClasspath)
    from({
        configurations.runtimeClasspath.get().filter { it.name.endsWith("jar") }.map { zipTree(it) }
    })
}

因此,在gradle clean build之后,您可以执行以下操作之一:

gradle run
> Hello, World!

假设您的投影仪使用build/libs/hello.jar中的jar,假设您在settings.gradle.kts中设置了rootProject.name = "hello"
然后您可以执行:

java -jar hello.jar
> Hello, World!
hlswsv35

hlswsv352#

尝试升级到1.3.41版并使用JDK 1.11+。

相关问题