แอปพลิเคชัน Kotlin พร้อมปลั๊กอินแอปพลิเคชัน Gradle

ฉันกำลังพยายามสร้างแอปพลิเคชัน HelloWorld อย่างง่ายโดยใช้ kotlin, gradle และปลั๊กอิน gradle application เมื่อฉันรันด้วยการตั้งค่าด้านล่าง ฉันได้รับข้อผิดพลาดต่อไปนี้:

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

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

My 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


person petarkolaric    schedule 12.12.2017    source แหล่งที่มา


คำตอบ (1)


ตามที่ระบุข้อผิดพลาด วิธีการหลักของคุณไม่คงที่ คุณมีตัวเลือกดังต่อไปนี้:

1) ใส่ตัวหลักลงใน companion object แล้วทำให้เป็น 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 {
}
person guenhter    schedule 12.12.2017
comment
ตัวเลือกที่ 1 และ 2 ใช้งานได้ แต่ฉันคิดว่าตัวเลือกที่ 3 คือสิ่งที่ฉันต้องการ อย่างไรก็ตาม เมื่อฉันลองใช้ ปรากฏว่า gradle ไม่พบวิธีการหลักอีกต่อไป: Error: Main method not found in class com.petarkolaric.helloworld.Main, please define the main method as: public static void main(String[] args) คุณรู้ไหมว่าทำไมถึงเป็นเช่นนี้ - person petarkolaric; 12.12.2017
comment
เนื่องจากชื่อคลาสเปลี่ยนไป: มันจะเป็น MainKt หากไฟล์ของคุณชื่อ Main.kt - person Alexey Romanov; 12.12.2017
comment
ฉันเข้าใจแล้ว - ฟังก์ชั่นระดับบนสุดถูกคอมไพล์เป็นคลาสของตัวเองซึ่งคุณต้องอ้างอิงจาก build.gradle ขอบคุณ! - person petarkolaric; 12.12.2017
comment
สำหรับตัวอย่างของคุณ 3) เป็นเรื่องที่ควรค่าแก่การกล่าวถึงว่าคุณสามารถละเว้นส่วน class Main {} และสิ่งที่ Alexey พูดได้อย่างแน่นอน - person Giszmo; 29.01.2019