【问题标题】:IntelliJ IDEA: How to specify main class in Kotlin?IntelliJ IDEA:如何在 Kotlin 中指定主类?
【发布时间】:2020-04-09 10:14:30
【问题描述】:

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

这是我的 Gradle:

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"
}

结构如下:

这是主要课程:

class MovieQuizBackend {

    fun main(args: Array<String>) {
        Server()
    }
}

【问题讨论】:

  • MovieQuizBackend 长什么样子?它是否在 IntelliJ IDEA 中运行而不在 jar 中?
  • @CrazyCoder 我添加了它。不,它也不会添加为主类来运行

标签: gradle intellij-idea kotlin


【解决方案1】:

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

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

fun main(args : Array<String>) {
    Server()
}

只需删除末尾的class MovieQuizBackend {}

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

fun main() {
    Server()
}

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

class MovieQuizBackend {
    companion object {
        @JvmStatic fun main(args : Array<String>) {
            Server()
        }
    }
}

请注意,这样主类只命名为MovieQuizBackend 而不是MovieQuizBackendKt,因此您需要在build.gradle 中更改它:

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

【讨论】:

  • 太奇怪了。我想知道为什么我们需要没有类的 kt 文件,我应该添加@JvmStatic。但这一切看起来很奇怪
  • 对于长期的 Java 开发人员来说可能看起来很奇怪,但对于新程序员来说这是很自然的,并且可以节省大量的打字。尝试解释一个开始编写代码的新学生为什么在 Java 中需要一个类和静态 main 方法只是为了打印“hello world”。 Kotlin 试图简化事情并减少您需要编写的代码量。
  • 如果你不使用它们,你甚至不需要args: Array&lt;String&gt;
  • 您是使用 Gradle 还是 IntelliJ IDEA 工件构建 jar?
  • @CrazyCoder artifact via Idea
猜你喜欢
  • 2018-09-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-06-02
  • 2018-11-16
  • 2017-11-01
  • 1970-01-01
相关资源
最近更新 更多