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。

  1. A plain JAR,由 Java 插件和 Spring Boot Gradle 配置的 plain 分类器创建插件
  2. A uber JAR 或由 Spring Boot Gradle 插件
  3. 创建的“胖”JAR

uber JAR 是一个可执行 JAR,您应该将其部署到 Heroku。

有关详细信息,请参阅文档:https://docs.spring.io/spring-boot/docs/current/gradle-plugin/reference/htmlsingle/#packaging-executable