Migrate to Spring Boot 4 (#868)

* Switched from TomCat to Jetty
* Hibernate migrations
* Removed dependency on Spring-Boot-Content-FS
* Migrate to Jackson 3
* Migrate LegacyExtensionFinder -> IndexedExtensionFinder
* Fix code inspection issues
* Exclude Config classes from Sonar coverage calcualtion
* Add FileStorageServiceTest
* Add tests for (De-)serializers
* Exclude H2 package from Sonar coverage reporting
* Add Sonar scan
* Update JVM in CI
* Update dependency versions
This commit is contained in:
grimsi
2026-02-01 10:48:26 +01:00
parent 111e164fab
commit ecd369cd30
103 changed files with 3562 additions and 2928 deletions
+46 -13
View File
@@ -12,6 +12,8 @@ plugins {
kotlin("plugin.jpa")
id("com.google.devtools.ksp")
application
jacoco
id("org.sonarqube")
}
application {
@@ -33,15 +35,19 @@ dependencies {
implementation("org.springframework.boot:spring-boot-starter-actuator")
implementation("org.springframework.boot:spring-boot-starter-security")
implementation("org.springframework.boot:spring-boot-starter-validation")
implementation("org.springframework.boot:spring-boot-starter-aop")
implementation("org.springframework.boot:spring-boot-starter-aspectj")
implementation("org.springframework.boot:spring-boot-starter-jackson")
implementation("org.springframework.cloud:spring-cloud-starter")
implementation("jakarta.validation:jakarta.validation-api:3.1.0")
implementation("jakarta.validation:jakarta.validation-api:${rootProject.extra["jakartaValidationVersion"]}")
// Kotlin extensions
implementation(kotlin("reflect"))
// Reactive
implementation("org.springframework.boot:spring-boot-starter-webflux")
implementation("org.springframework.boot:spring-boot-starter-webflux") {
exclude(group = "org.springframework.boot", module = "spring-boot-starter-reactor-netty")
}
implementation("org.springframework.boot:spring-boot-starter-jetty")
implementation("io.projectreactor.kotlin:reactor-kotlin-extensions")
implementation("org.jetbrains.kotlinx:kotlinx-coroutines-reactor")
@@ -49,17 +55,19 @@ dependencies {
implementation("com.vaadin:vaadin-core") {
exclude("com.vaadin:flow-react")
}
implementation("com.vaadin:vaadin-spring-boot-starter")
implementation("com.vaadin:vaadin-spring-boot-starter") {
exclude(group = "org.springframework.boot", module = "spring-boot-starter-tomcat")
}
implementation("com.vaadin:hilla-spring-boot-starter")
// Logging
implementation("io.github.oshai:kotlin-logging-jvm:7.0.3")
implementation("io.github.oshai:kotlin-logging-jvm:${rootProject.extra["kotlinLoggingVersion"]}")
// Persistence & I/O
implementation("org.springframework.boot:spring-boot-starter-data-jpa")
implementation("com.github.paulcwarren:spring-content-fs-boot-starter:3.0.17")
implementation("org.flywaydb:flyway-core")
implementation("commons-io:commons-io:2.18.0")
implementation("com.google.guava:guava:33.5.0-jre")
implementation("org.springframework.boot:spring-boot-starter-flyway")
implementation("commons-io:commons-io:${rootProject.extra["commonsIoVersion"]}")
implementation("com.google.guava:guava:${rootProject.extra["guavaVersion"]}")
// SSO
implementation("org.springframework.boot:spring-boot-starter-oauth2-client")
@@ -68,18 +76,19 @@ dependencies {
// Notifications
implementation("org.springframework.boot:spring-boot-starter-mail")
implementation("ch.digitalfondue.mjml4j:mjml4j:1.1.4")
implementation("ch.digitalfondue.mjml4j:mjml4j:${rootProject.extra["mjml4jVersion"]}")
// Plugins
implementation(project(":plugin-api"))
// Utils
implementation("org.apache.tika:tika-core:3.2.3")
implementation("me.xdrop:fuzzywuzzy:1.4.0")
implementation("com.vanniktech:blurhash:0.3.0")
implementation("org.apache.tika:tika-core:${rootProject.extra["tikaVersion"]}")
implementation("me.xdrop:fuzzywuzzy:${rootProject.extra["fuzzywuzzyVersion"]}")
implementation("com.vanniktech:blurhash:${rootProject.extra["blurhashVersion"]}")
// Development
developmentOnly("org.springframework.boot:spring-boot-devtools")
developmentOnly("com.vaadin:vaadin-dev")
annotationProcessor("org.springframework.boot:spring-boot-configuration-processor")
runtimeOnly("com.h2database:h2")
runtimeOnly("io.micrometer:micrometer-registry-prometheus")
@@ -103,6 +112,30 @@ dependencyManagement {
tasks.withType<Test> {
useJUnitPlatform()
finalizedBy(tasks.jacocoTestReport)
}
tasks.jacocoTestReport {
dependsOn(tasks.test)
reports {
xml.required = true
xml.outputLocation = layout.buildDirectory.file("reports/jacoco/test/jacocoTestReport.xml")
}
}
tasks.named("sonar") {
dependsOn(tasks.jacocoTestReport)
}
sonar {
properties {
property("sonar.organization", "gameyfin")
property("sonar.projectKey", "gameyfin_gameyfin")
property("sonar.projectName", "gameyfin")
property("sonar.host.url", "https://sonarcloud.io")
property("sonar.coverage.jacoco.xmlReportPaths", "build/reports/jacoco/test/jacocoTestReport.xml")
property("sonar.coverage.exclusions", "**/*Config.kt,**/org/gameyfin/db/h2/**")
}
}
tasks.named<ProcessResources>("processResources") {