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