Spring Boot + Kotlin + Gradle - Error: Main method not found in class
Spring Boot + Kotlin + Gradle - Error: Main method not found in class
我正在学习 spring 使用 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)
}
有人知道我错过了什么吗?这是 spring 上的第一个项目,我正在尝试在 heroku 上部署,所以请多多包涵。
提前谢谢你。
您是否尝试过像错误消息中建议的那样更改 main 方法,即 public static void main(String[] args)
我只需要做一些事情就可以让它工作:
在build.gradle.kts中,我删除了jar类型的任务,并添加了这个:
springBoot{
mainClass.set("com.markoid.packit.PackitApplicationKt")
}
我需要添加一个 Procfile,具有以下内容:
web: java -Dserver.port=$PORT $JAVA_OPTS -jar build/libs/packit-1.0.0-SNAPSHOT.jar
这样的文件会告诉 heroku 我要对生成的 jar 运行 执行的具体命令。
我遇到过同样的问题。我有问题的配置是:
- 科特林 1.5.21
- Spring 启动 2.5.2
- Gradle 7.1.1
问题是在IDEA中可以运行,但不能不使用gradlew命令行。我去检查了所有旧项目。它们的构建 运行 没有任何问题。不同之处在于版本。我之前所有的项目在我上面提到的所有位置都有较低的版本。所以我提示问题出在版本上,但它是什么工具?科特林,Spring,Gradle?我还没有找到罪魁祸首(现在也没有时间深入研究这个问题),但我找到了解决方案。
如果您在任何压缩器(例如 WinRAR)中打开您的 jar 文件并查看 MANIFEST.MD,您将看到以 'Start-Class' 开头的行,这是您的主要class并且必须以'Kt'后缀结尾,例如
Start-Class: me.sigest.fiveplus.FiveplusApplicationKt
在我失败的罐子里它不是。为了修复它,我更改了 build.gradle.kts 文件中的代码并设置了
springBoot {
mainClass.set("com.example.MyMainClassKt")
}
尽管事实上我的 class 被称为 MyMainClass(没有后缀 Kt)并且它帮助了
P.S。我所有的旧引导罐都包含带有 Kt 的 main class 的正确名称。我想问题出在 Gradle
我正在学习 spring 使用 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)
}
有人知道我错过了什么吗?这是 spring 上的第一个项目,我正在尝试在 heroku 上部署,所以请多多包涵。
提前谢谢你。
您是否尝试过像错误消息中建议的那样更改 main 方法,即 public static void main(String[] args)
我只需要做一些事情就可以让它工作:
在build.gradle.kts中,我删除了jar类型的任务,并添加了这个:
springBoot{ mainClass.set("com.markoid.packit.PackitApplicationKt") }
我需要添加一个 Procfile,具有以下内容:
web: java -Dserver.port=$PORT $JAVA_OPTS -jar build/libs/packit-1.0.0-SNAPSHOT.jar
这样的文件会告诉 heroku 我要对生成的 jar 运行 执行的具体命令。
我遇到过同样的问题。我有问题的配置是:
- 科特林 1.5.21
- Spring 启动 2.5.2
- Gradle 7.1.1
问题是在IDEA中可以运行,但不能不使用gradlew命令行。我去检查了所有旧项目。它们的构建 运行 没有任何问题。不同之处在于版本。我之前所有的项目在我上面提到的所有位置都有较低的版本。所以我提示问题出在版本上,但它是什么工具?科特林,Spring,Gradle?我还没有找到罪魁祸首(现在也没有时间深入研究这个问题),但我找到了解决方案。 如果您在任何压缩器(例如 WinRAR)中打开您的 jar 文件并查看 MANIFEST.MD,您将看到以 'Start-Class' 开头的行,这是您的主要class并且必须以'Kt'后缀结尾,例如
Start-Class: me.sigest.fiveplus.FiveplusApplicationKt
在我失败的罐子里它不是。为了修复它,我更改了 build.gradle.kts 文件中的代码并设置了
springBoot {
mainClass.set("com.example.MyMainClassKt")
}
尽管事实上我的 class 被称为 MyMainClass(没有后缀 Kt)并且它帮助了
P.S。我所有的旧引导罐都包含带有 Kt 的 main class 的正确名称。我想问题出在 Gradle