Spring Boot + Kotlin + Gradle — ошибка: основной метод не найден в классе

avatar
knockmark10
1 июля 2021 в 21:08
1647
3
3

Я изучаю весеннюю загрузку с Kotlin (так как я пришел с Android с Kotlin). Я установил его с помощью gradle. На моей локальной машине все работает нормально. Но у меня возникли некоторые проблемы при попытке развернуть его на Heroku.

Я получаю сообщение об ошибке:

Error: Main method not found in class com.markoid.packit.PackitApplication, please define the main method as:
2021-07-01T20:58:51.075484+00:00 app[web.1]:    public static void main(String[] args)
2021-07-01T20:58:51.075581+00:00 app[web.1]: or a JavaFX application class must extend javafx.application.Application

Я читал в других сообщениях, что мне нужно добавить файл system.properties в корень, что я и сделал, но ничего не изменилось.

system.properties

java.runtime.version=11

А это мой build.gradle.kts

import org.jetbrains.kotlin.gradle.tasks.KotlinCompile

plugins {
    id("org.springframework.boot") version "2.5.1"
    id("io.spring.dependency-management") version "1.0.11.RELEASE"
    kotlin("jvm") version "1.5.10"
    kotlin("plugin.spring") version "1.5.10"
}

group = "com.markoid"
version = "1.0.0-SNAPSHOT"
java.sourceCompatibility = JavaVersion.VERSION_11

repositories {
    mavenCentral()
}

dependencies {
    // Spring Boot Core
    implementation("org.springframework.boot:spring-boot-starter-web")
    implementation("org.springframework.boot:spring-boot-starter-validation")
    implementation("org.springframework.boot:spring-boot-starter-security")
    implementation("org.springframework.boot:spring-boot-starter-mail")
    implementation("org.springframework.boot:spring-boot-starter-data-mongodb")

    // Joda Time library
    implementation("joda-time:joda-time:2.10")

    // Json Web Token
    implementation("io.jsonwebtoken:jjwt-impl:0.11.1")
    implementation("io.jsonwebtoken:jjwt-api:0.11.1")
    implementation("io.jsonwebtoken:jjwt-jackson:0.11.1")

    // Serializers
    implementation("com.fasterxml.jackson.module:jackson-module-kotlin")

    // Documentation
    implementation("io.springfox:springfox-swagger2:2.6.1")

    // Kotlin related
    implementation("org.jetbrains.kotlin:kotlin-reflect")
    implementation("org.jetbrains.kotlin:kotlin-stdlib-jdk8")

    // Testing Frameworks
    testImplementation("org.springframework.boot:spring-boot-starter-test")
}

tasks.withType<KotlinCompile> {
    kotlinOptions {
        freeCompilerArgs = listOf("-Xjsr305=strict")
        jvmTarget = "11"
    }
}

tasks.withType<Test> {
    useJUnitPlatform()
}

tasks.withType<Jar> {
    manifest {
        attributes["Main-Class"] = "com.markoid.packit.PackitApplication"
    }
}

Файл моего приложения такой же простой:

@SpringBootApplication
class PackitApplication

fun main(args: Array<String>) {
    runApplication<PackitApplication>(*args)
}

Кто-нибудь знает, что мне не хватает? Это первый весенний проект, который я пытаюсь развернуть на героку, так что, пожалуйста, потерпите меня.

Заранее спасибо.

Источник
DCTID
1 июля 2021 в 21:36
0

Во-первых, работает ли он локально. Если да, то как вы его создаете и развертываете?

knockmark10
1 июля 2021 в 23:02
0

@DCTID Да, он работает локально. Я использую Intellij IDEA, поэтому я просто нажимаю кнопку «Воспроизвести», и приложение запускается. Для развертывания я использую интеграцию с Github, поэтому он создает ее с основной веткой.

Ответы (3)

avatar
knockmark10
2 июля 2021 в 20:47
2

Мне нужно было сделать несколько вещей, чтобы заставить его работать:

  1. В build.gradle.kts я удалил задачи с типом jar и добавил это:

    пружинная загрузка { mainClass.set("com.markoid.packit.PackitApplicationKt") }

  2. Мне нужно было добавить Procfile со следующим:

    веб-сайт: java -Dserver.port=$PORT $JAVA_OPTS -jar build/libs/packit-1.0.0-SNAPSHOT.jar

Такой файл сообщит герою конкретную команду, которую я хочу выполнить для запуска сгенерированного jar.

avatar
Herman Sid
17 июля 2021 в 17:43
4

Я столкнулся с той же проблемой. Моя проблемная конфигурация:

  • Котлин 1.5.21
  • Пружинная загрузка 2.5.2
  • Грейдл 7.1.1

Проблема заключалась в том, что в IDEA его можно запустить, но нельзя без использования командной строки gradlew. Я пошел и проверил все старые проекты. Они были построены и работают без каких-либо проблем. Разница была в версиях. Все мои предыдущие проекты имели более низкие версии во всех позициях, которые я указал выше. Вот я и предположил, что проблема в версии, а в каком именно инструменте? Котлин, Спринг, Грейдл? Виновных пока не нашел (да и некогда сейчас углубляться в эту проблему), но нашел решение. Если вы откроете файл jar в любом архиваторе (например, WinRAR) и посмотрите MANIFEST.MD, вы увидите строку, начинающуюся с 'Start-Class', это ваш основной класс, и он должен заканчиваться на Суффикс 'Kt', например

Начальный класс: me.sigest.fiveplus.FiveplusApplicationKt

В моей неудавшейся банке его не было. Чтобы исправить это, я изменил код в файле build.gradle.kts и установил

springBoot {
    mainClass.set("com.example.MyMainClassKt")
}

Несмотря на то, что на самом деле мой класс называется MyMainClass (без суффикса Kt) и это помогло

П.С. все мои старые загрузочные банки содержат правильное имя основного класса с Kt. Я предполагаю, что проблема в Gradle

avatar
Madhu A
2 июля 2021 в 02:19
-1

Вы пытались изменить основной метод, как это предлагается в сообщении об ошибке, т.е. public static void main(String[] args)

Apurv Kamalapuri
21 сентября 2021 в 03:27
0

kotlin имеет основной метод с другим синтаксисом fun main(args: Array<String>) { runApplication<MyApplication>(*args) }