IntelliJ IDEA:如何在 Kotlin 中指定主类?

Vla*_*eev 7 intellij-idea gradle kotlin

我尝试使用 Intellij Idea 和 Kotlin Gradle 项目构建一个 jar。当我尝试配置 Artifact 时,Idea 看不到我的主类

这是我的摇篮:

plugins {
    id 'java'
    id 'org.jetbrains.kotlin.jvm' version '1.3.60'
    id 'application'
}
group 'org.vladdrummer'
version '1.0-SNAPSHOT'

sourceCompatibility = 1.8

repositories {
    mavenCentral()
}

sourceSets {
    main.java.srcDirs += 'src/main/kotlin/'
}

jar {
    manifest {
        attributes 'Main-Class': 'MovieQuizBackendKt'
    }
}

dependencies {
    implementation "org.jetbrains.kotlin:kotlin-stdlib-jdk8"
    compile "com.sparkjava:spark-kotlin:1.0.0-alpha"
    implementation 'com.google.code.gson:gson:2.8.2'
    runtime 'mysql:mysql-connector-java:5.1.34'
    testCompile group: 'junit', name: 'junit', version: '4.12'
}

compileKotlin {
    kotlinOptions.jvmTarget = "1.8"
}
compileTestKotlin {
    kotlinOptions.jvmTarget = "1.8"
}
Run Code Online (Sandbox Code Playgroud)

这是结构:

结构体

这是主要课程:

class MovieQuizBackend {

    fun main(args: Array<String>) {
        Server()
    }
}
Run Code Online (Sandbox Code Playgroud)

Cra*_*der 9

在 Kotlin 语言中,入口点不是类内部的方法(Kt名称中带有后缀的类是从文件自动生成的)。请参阅文档

您在MovieQuizBackend.kt文件中的代码需要更改为以下内容:

fun main(args : Array<String>) {
    Server()
}
Run Code Online (Sandbox Code Playgroud)

只需删除class MovieQuizBackend {}最后。

args如果你不打算通过任何,你甚至可以省略:

fun main() {
    Server()
}
Run Code Online (Sandbox Code Playgroud)

另一种选择是在 中使用@JvmStatic注释companion object

class MovieQuizBackend {
    companion object {
        @JvmStatic fun main(args : Array<String>) {
            Server()
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

请注意,通过这种方式,主类被命名为,MovieQuizBackend而不是MovieQuizBackendKt,因此您需要将其更改为build.gradle

jar {
    manifest {
        attributes 'Main-Class': 'MovieQuizBackend'
    }
}
Run Code Online (Sandbox Code Playgroud)

  • 太奇怪了。我想知道为什么我们需要没有类的 kt 文件,我应该添加 @JvmStatic。但这一切看起来很奇怪 (2认同)