Kotlin Spring Boot Gradle - 创建名为"resourceHandlerMapping"的 bean 时出错 - 没有 ServletContext 集



我第一次尝试用Kotlin,Gradle创建Spring Boot应用程序,并在heroku上运行。使用Spring Initializr在IntelliK Idea 2022.1(最终版)中创建的项目当应用程序在本地主机上运行时,一切都很好,但是当我尝试从jar文件运行应用程序时,会出现一些问题。
第一个问题:

no main manifest attribute, in build/libs/app-0.0.1-plain.jar

所以我添加了build.gradle.kts

tasks.jar {
manifest {
attributes["Main-Class"] = "com.example.package.ApplicationKt"
}
}

第二个问题:

Exception in thread "main" java.lang.NoClassDefFoundError: kotlin/jvm/internal/Intrinsics
为了解决这个问题,我在tasks.jar中添加了

from(sourceSets.main.get().output)
dependsOn(configurations.runtimeClasspath)
from({
configurations.runtimeClasspath.get().filter { it.name.endsWith("jar") }.map { zipTree(it) }
})

下一个:

Entry META-INF/LICENSE.txt is a duplicate but no duplicate handling strategy has been set

我的解决方案:

duplicatesStrategy = DuplicatesStrategy.EXCLUDE

最后是老板:

org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'resourceHandlerMapping' defined in class path resource [org/springframework/boot/autoconfigure/web/servlet/WebMvcAutoConfiguration$EnableWebMvcConfiguration.class]: Bean instanti
ation via factory method failed; nested exception is org.springframework.beans.BeanInstantiationException: Failed to instantiate [org.springframework.web.servlet.HandlerMapping]: Factory method 'resourceHandlerMapping' threw exception; nested exception is java.lang.
IllegalStateException: No ServletContext set

我不知道如何解决这个问题,我试着替换

implementation("org.springframework.boot:spring-boot-starter-web")

implementation("org.springframework.boot:spring-boot-starter-webflux")

但它没有工作。在控制台,我看到有很多负面匹配,其中之一:

@ConditionalOnClass did not find required class 'javax.jms.ConnectionFactory' (OnClassCondition)

我也试过在java 11上运行它,但结果相同。有人知道我该怎么做吗?

运行应用程序,我使用:

java -jar build/libs/app-0.0.1-plain.jar --server.port=8080

最后的build.gradle.kts

import org.jetbrains.kotlin.gradle.tasks.KotlinCompile
plugins {
id("org.springframework.boot") version "2.6.7"
id("io.spring.dependency-management") version "1.0.11.RELEASE"
kotlin("jvm") version "1.6.21"
kotlin("plugin.spring") version "1.6.21"
}
group = "com.example"
version = "0.0.1"
java.sourceCompatibility = JavaVersion.VERSION_1_8
repositories {
mavenCentral()
}
tasks.jar {
manifest {
attributes["Main-Class"] = "com.example.package.ApplicationKt"
}
duplicatesStrategy = DuplicatesStrategy.EXCLUDE
// To add all of the dependencies
from(sourceSets.main.get().output)
dependsOn(configurations.runtimeClasspath)
from({
configurations.runtimeClasspath.get().filter { it.name.endsWith("jar") }.map { zipTree(it) }
})
}
dependencies {
implementation("org.springframework.boot:spring-boot-starter-web")
implementation("com.fasterxml.jackson.module:jackson-module-kotlin")
implementation("org.jetbrains.kotlin:kotlin-reflect")
implementation("org.jetbrains.kotlin:kotlin-stdlib-jdk8")
runtimeOnly("org.postgresql:postgresql")
testImplementation("org.springframework.boot:spring-boot-starter-test")
}
tasks.withType<KotlinCompile> {
kotlinOptions {
freeCompilerArgs = listOf("-Xjsr305=strict")
jvmTarget = "1.8"
}
}
tasks.withType<Test> {
useJUnitPlatform()
}

您使用了错误的JAR来部署到Heroku。当Spring Boot Gradle插件被应用时,有(2)个jar被创建。

  1. 一个plainJAR,由Java插件创建,并由Spring Boot Gradle插件
  2. 配置plain分类器。
  3. AuberJAR或"fat"由Spring Boot Gradle插件
  4. 创建的JAR

优步JAR是一个可执行的JAR,是你应该部署到Heroku的。

查看文档获取更多详细信息:https://docs.spring.io/spring-boot/docs/current/gradle-plugin/reference/htmlsingle/#packaging-executable

相关内容

最新更新