使用Gradle应用程序插件创建Kotlin应用程序

8

我正在尝试使用 kotlingradle 和 gradle 的 application 插件创建一个简单的 HelloWorld 应用程序。当我使用以下设置运行它时,我会收到以下错误:

Error: Main method is not static in class com.petarkolaric.helloworld.Main, please define the main method as:
public static void main(String[] args)

我的build.gradle文件:

group 'helloworld'
version '1.0-SNAPSHOT'

buildscript {
    ext.kotlin_version = '1.2.0'

    repositories {
        mavenCentral()
    }
    dependencies {
        classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version"
    }
}

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

mainClassName = "com.petarkolaric.helloworld.Main"

repositories {
    mavenCentral()
}

dependencies {
    compile "org.jetbrains.kotlin:kotlin-stdlib-jdk8:$kotlin_version"
}

compileKotlin {
    kotlinOptions.jvmTarget = "1.8"
}
compileTestKotlin {
    kotlinOptions.jvmTarget = "1.8"
}

这是我的src/main/kotlin/com/petarkolaric/helloworld/Main.kt文件:

package com.petarkolaric.helloworld

class Main {

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

根据这篇博客文章,我应该能够以这种方式使用应用程序插件。
要使application插件在运行gradle run时运行我的主函数,我需要做什么更改?
1个回答

19

正如错误提示所说,你的主方法不是静态的。你有以下几个选项:

1)将主方法放入伴生对象中,并使其JvmStatic

class Main {
    companion object {
        @JvmStatic
        fun main(args : Array<String>) {
            println("Hello, World!")
        }
    }
}

2) 将你的class更改为object - 这样你就拥有了一个几乎是单例的class,并将其设置为JvmStatic

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

3) 将主函数放在类外面

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

2
选项1和2可行,但我认为选项3是我更喜欢的。然而,当我尝试时,似乎gradle无法找到主方法:错误:在类com.petarkolaric.helloworld.Main中找不到主方法,请定义主方法: public static void main(String [] args)你有任何想法为什么会这样吗? - petarkolaric
10
由于类名会改变:如果你的文件名是Main.kt,那么它将变为MainKt - Alexey Romanov
我明白了 - 顶层函数被编译成它们自己的类,你需要从 build.gradle 中引用它们。谢谢! - petarkolaric
2
对于您的第三个示例,值得一提的是,您可以省略 class Main {} 部分,当然也要考虑到 Alexey 的建议。 - Giszmo

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接