Приложение 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 {} и то, что сказал Алексей, конечно. - person Giszmo; 29.01.2019