由于缺少 ServletWebServerFactory bean,Spring Boot jar 无法启动 Web 服务器

Posted

技术标签:

【中文标题】由于缺少 ServletWebServerFactory bean,Spring Boot jar 无法启动 Web 服务器【英文标题】:Spring Boot jar Unable to start web server due to missing ServletWebServerFactory bean 【发布时间】:2019-12-03 20:25:21 【问题描述】:

我已经使用 Spring BootKotlinGradle 创建了 REST 后端系统。 从 IDE 运行时一切正常。 但是当我创建 jar 文件并使用控制台运行它时 java -jar app.jar 我收到此错误:

错误 org.springframework.boot.SpringApplication - 应用程序运行失败 org.springframework.context.ApplicationContextException:无法启动网络服务器;嵌套异常是 org.springframework.context.ApplicationContextException: Unable to start ServletWebServerApplicationContext due to missing ServletWebServerFactory bean。

我尝试了多种解决方案,但我在网上找到的似乎都没有帮助。我是 Spring Boot 的新手,所以我可能缺少一些东西。

我使用 IntellijSpring Initializr 模板。

build.gradle.kts

import org.jetbrains.kotlin.gradle.tasks.KotlinCompile

plugins 
    id("org.springframework.boot") version "2.1.6.RELEASE"
    id("io.spring.dependency-management") version "1.0.7.RELEASE"
    id("org.jetbrains.kotlin.plugin.jpa") version "1.3.41"
    kotlin("jvm") version "1.3.41"
    kotlin("plugin.spring") version "1.3.41"


group = "sk.demo"
version = "0.1.1"
java.sourceCompatibility = JavaVersion.VERSION_1_8

val developmentOnly by configurations.creating
configurations 
    runtimeClasspath 
        extendsFrom(developmentOnly)
    


repositories 
    mavenCentral()


dependencies 
    implementation("org.springframework.boot:spring-boot-starter-data-jpa")
    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")
    developmentOnly("org.springframework.boot:spring-boot-devtools")
    runtimeOnly("mysql:mysql-connector-java")
    testImplementation("org.springframework.boot:spring-boot-starter-test")


tasks.withType<KotlinCompile> 
    kotlinOptions 
        freeCompilerArgs = listOf("-Xjsr305=strict")
        jvmTarget = "1.8"
    

DemoBeApplication.kt

package sk.demo.demo

import org.springframework.boot.autoconfigure.SpringBootApplication
import org.springframework.boot.runApplication

@SpringBootApplication
class DemoBeApplication

fun main(args: Array<String>) 
    runApplication<DemoBeApplication>(*args)

DemoBeApplication.kt 我试过的另一个版本

package sk.demo.demo

import org.springframework.boot.SpringApplication
import org.springframework.boot.autoconfigure.SpringBootApplication
import org.springframework.boot.web.servlet.support.SpringBootServletInitializer

@SpringBootApplication
class DemoBeApplication : SpringBootServletInitializer()

fun main(args: Array<String>) 
    SpringApplication.run(DemoBeApplication::class.java, *args)

【问题讨论】:

您使用哪个命令来创建app.jar 我已经使用项目选项创建了工件,它包含所有模块,它是完整的,tomcat 在列表中。它还包括带有主类信息的manifect。然后我使用选项来构建工件。 【参考方案1】:

我建议阅读更多关于Spring Boot Gradle Plugin 的信息。听起来您想使用bootJar 任务。这些步骤对我有用:

./gradlew bootJar
# ...
# BUILD SUCCESSFUL in 56s
# 3 actionable tasks: 3 executed

java -jar build/libs/demo-0.0.1-SNAPSHOT.jar
#   .   ____          _            __ _ _
#  /\\ / ___'_ __ _ _(_)_ __  __ _ \ \ \ \
# ( ( )\___ | '_ | '_| | '_ \/ _` | \ \ \ \
#  \\/  ___)| |_)| | | | | || (_| |  ) ) ) )
#   '  |____| .__|_| |_|_| |_\__, | / / / /
#  =========|_|==============|___/=/_/_/_/
#  :: Spring Boot ::        (v2.1.6.RELEASE)
# 
# 2019-07-25 08:54:05.197  INFO 12021 --- [           main] com.example.demo.DemoApplicationKt       : Starting DemoApplicationKt
# 2019-07-25 08:54:05.200  INFO 12021 --- [           main] com.example.demo.DemoApplicationKt       : No active profile set, falling back to default profiles: default
# 2019-07-25 08:54:05.851  INFO 12021 --- [           main] com.example.demo.DemoApplicationKt       : Started DemoApplicationKt in 1.01 seconds (JVM running for 1.449)

【讨论】:

以上是关于由于缺少 ServletWebServerFactory bean,Spring Boot jar 无法启动 Web 服务器的主要内容,如果未能解决你的问题,请参考以下文章

Visual Studio 由于缺少调试目标

由于缺少位置权限,应用程序在启动时崩溃

由于缺少对象,DACPAC 无法部署

由于缺少 KIF 类,项目无法构建

“场景由于缺少入口点而无法访问并且没有...” - 解决此警告

由于缺少文件,快照无法使用