Search code examples
springspring-bootkotlinjar

Spring Boot jar Unable to start web server due to missing ServletWebServerFactory bean


I have create REST back end system using Spring Boot with Kotlin and Gradle. Everything works fine when running from IDE. But when I create jar file and run it using console java -jar app.jar I get this error:

ERROR org.springframework.boot.SpringApplication - Application run failed org.springframework.context.ApplicationContextException: Unable to start web server; nested exception is org.springframework.context.ApplicationContextException: Unable to start ServletWebServerApplicationContext due to missing ServletWebServerFactory bean.

I tried multiple solutions, but nothing I found online seems to help. Iam new to Spring Boot, so there is probably something Iam missing.

I have used Intellij with Spring Initializr template.

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 another version which I tried

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)
}

Solution

  • I recommend reading more about the Spring Boot Gradle Plugin. It sounds like you want to use the bootJar task. These steps work for me:

    ./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)