Error: Main method is not static in class. Kotlin Project

Error: Main method is not static in class. Kotlin Project

我需要创建一个可运行的 Jar 文件,它是来自 Kotlin 项目的控制台应用程序。我使用 gradle init 设置了这个项目。我通过将 main 方法移出 class,将其包装在伴随对象中,并使用 JvmStatic 注释尝试了我可以在网上找到的所有解决方案,但我仍然不断收到错误消息“错误:Main 方法不是静态的” class com.yk.ConsoleGradle.App,请将主要方法定义为: public static void main(String[] args)"

我正在使用 ./gradlew jar 来构建项目

class App {
    val greeting: String
        get() {
            return "Hello World!"
        }
   
    fun main(args: Array<String>){
        println("Hello kotlin")
    }
}

application {
    // Define the main class for the application.
    mainClass.set("com.yk.ConsoleGradle.AppKt")
}
tasks.jar{
    manifest {
        attributes(mapOf("Implementation-Title" to project.name,
                "Implementation-Version" to project.version, "Main-Class" to "com.yk.ConsoleGradle.App" ))

    }
}

这是 jar tf 的输出

jar tf /ConsoleGradle/app/build/libs/app-1.0.1.jar 
META-INF/
META-INF/MANIFEST.MF
META-INF/app.kotlin_module
com/
com/yk/
com/yk/ConsoleGradle/
com/yk/ConsoleGradle/AppKt.class
com/yk/ConsoleGradle/App.class

感谢任何帮助。

我不知道这是否是您正在做的事情的正确方法,但是怎么样

class App {
    val greeting: String
        get() {
            return "Hello World!"
        }
    companion object {
        @JvmStatic
        fun main(args: Array<String>){
            println("Hello kotlin")
        }
    }
}

companion object 使函数可通过 class 而不是通过实例访问,并且 JvmStatic 注释为 Java interop[=14 生成静态方法=]

如果您不想在 App class 中声明主函数,您可以使用以下代码创建一个 App.kt 文件:

class App {
    val greeting: String
        get() {
            return "Hello World!"
        }
}

fun main(args: Array<String>){
    println("Hello kotlin")
}

您还需要将 gradle jar 任务更新为:

jar {
    manifest {
        attributes "Implementation-Title": project.name
        attributes "Implementation-Version": project.version
        attributes "Main-Class": "com.yk.ConsoleGradle.AppKt"
    }
}

请注意 Main-Class 被指定为 AppKt 而不是 App。
这是因为 main 函数是一个 top-level 函数,对于 App.kt 中的 top-level 函数,Kotlin 编译器创建了一个名为 AppKt.class.

的 class