Kotlin Spring Boot Gradle - 创建名称为 'resourceHandlerMapping' 的 bean 时出错 - 未设置 ServletContext
Kotlin Spring Boot Gradle - Error creating bean with name 'resourceHandlerMapping' - No ServletContext set
我第一次尝试使用 Kotlin 创建 Spring 引导应用程序,Gradle 并在 heroku 上 运行 它。
使用 Spring Initializr 在 IntelliK Idea 2022.1(终极版)中创建的项目
当应用程序被 ide 在本地主机上 运行ned 时,一切正常,但是当我尝试从 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 上 运行 它,但结果相同。
有人ide知道我应该怎么做吗?
至 运行 我使用的应用程序:
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。
- A plain JAR,由 Java 插件和 Spring Boot Gradle 配置的
plain
分类器创建插件
- A uber JAR 或由 Spring Boot Gradle 插件
创建的“胖”JAR
uber JAR 是一个可执行 JAR,您应该将其部署到 Heroku。
有关详细信息,请参阅文档:https://docs.spring.io/spring-boot/docs/current/gradle-plugin/reference/htmlsingle/#packaging-executable
我第一次尝试使用 Kotlin 创建 Spring 引导应用程序,Gradle 并在 heroku 上 运行 它。
使用 Spring Initializr 在 IntelliK Idea 2022.1(终极版)中创建的项目
当应用程序被 ide 在本地主机上 运行ned 时,一切正常,但是当我尝试从 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 上 运行 它,但结果相同。 有人ide知道我应该怎么做吗?
至 运行 我使用的应用程序:
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。
- A plain JAR,由 Java 插件和 Spring Boot Gradle 配置的
plain
分类器创建插件 - A uber JAR 或由 Spring Boot Gradle 插件 创建的“胖”JAR
uber JAR 是一个可执行 JAR,您应该将其部署到 Heroku。
有关详细信息,请参阅文档:https://docs.spring.io/spring-boot/docs/current/gradle-plugin/reference/htmlsingle/#packaging-executable