【问题标题】:Spring Boot + Kotlin + Gradle - Error: Main method not found in classSpring Boot + Kotlin + Gradle - 错误:在类中找不到主要方法
【发布时间】:2021-09-13 22:08:39
【问题描述】:

我正在使用 Kotlin 学习 spring boot(因为我来自 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)
}

有人知道我错过了什么吗?这是我尝试在 heroku 上部署的第一个春季项目,所以请与我联系。

提前谢谢你。

【问题讨论】:

  • 首先,它是否在本地运行。如果是这样,您将如何构建和部署它?
  • @DCTID 是的,它在本地运行。我正在使用 Intellij IDEA,所以我只需按下“播放”按钮,它就会启动应用程序。对于部署,我使用的是 Github 集成,所以它使用 master 分支构建它

标签: spring-boot kotlin gradle heroku


【解决方案1】:

我只需要做一些事情就可以让它发挥作用:

  1. build.gradle.kts中,我删除了jar类型的任务,并添加了这个:

    springBoot { mainClass.set("com.markoid.packit.PackitApplicationKt") }

  2. 我需要添加一个 Procfile,其中包含以下内容:

    网络:java -Dserver.port=$PORT $JAVA_OPTS -jar build/libs/packit-1.0.0-SNAPSHOT.jar

这样的文件会告诉heroku我想要执行的具体命令来运行生成的jar。

【讨论】:

    【解决方案2】:

    我也遇到过同样的问题。我有问题的配置是:

    • Kotlin 1.5.21
    • Spring Boot 2.5.2
    • Gradle 7.1.1

    问题是在 IDEA 中可以运行,但不能不使用 gradlew 命令行。我去检查了所有旧项目。它们的构建和运行没有任何问题。不同之处在于版本。我之前的所有项目在我上面提到的所有位置都有较低的版本。所以我建议问题出在版本上,但它是什么工具? Kotlin、Spring、Gradle?我还没有找到罪魁祸首(现在没有时间深入研究这个问题),但我找到了解决方案。 如果您在任何存档器(例如 WinRAR)中打开您的 jar 文件并查看 MANIFEST.MD,您将看到以 'Start-Class' 开头的行,这是您的主类,它必须结束以'Kt'后缀为例

    Start-Class:me.sigest.fiveplus.FiveplusApplicationKt

    在我失败的 jar 中它不是。为了修复它,我更改了 build.gradle.kts 文件中的代码并设置

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

    尽管事实上我的课程被称为 MyMainClass(没有后缀 Kt)并且它有所帮助

    附:我所有的旧引导 jar 都包含带有 Kt 的主类的正确名称。我想问题出在 Gradle 中

    【讨论】:

      【解决方案3】:

      您是否尝试过按照错误消息中的建议更改 main 方法,即 public static void main(String[] args)

      【讨论】:

      • kotlin 的 main 方法具有不同的语法 fun main(args: Array&lt;String&gt;) { runApplication&lt;MyApplication&gt;(*args) }
      猜你喜欢
      • 2020-05-17
      • 2018-05-09
      • 1970-01-01
      • 2016-03-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-08-22
      • 1970-01-01
      相关资源
      最近更新 更多