Issues
In the previous article, we broke down the components of the Spring Initializr Gradle build. I posted the article to the Kotlin language slack for feedback and Björn Kautler suggested a few improvements we could make.
Issue 1: Spring dependency management plugin
The plugin filled a niche back in the days when Gradle didn’t have support for importing BOMs. Now we can simply import the Spring Boot BOM instead of using the plugin.
1
2
3
dependencies {
implementation(platform("org.springframework.boot:spring-boot-dependencies:${springBootVersion}"))
}
In case we’re also applying the Spring Boot plugin, we can get the coordinates for the BOM using a provided property:
1
2
3
dependencies {
implementation(platform(org.springframework.boot.gradle.plugin.SpringBootPlugin.BOM_COORDINATES))
}
Issue 2: Spring configured Kotlin 1.7 by default
According to Sebastien Deleuze, Spring should already be Kotlin 1.8 compatible. Let’s configure it instead!
1
2
3
4
5
plugins {
id("org.springframework.boot") version "3.0.3"
kotlin("jvm") version "1.8.10"
kotlin("plugin.spring") version "1.8.10"
}
This has the added benefit of letting us use improved toolchain support for configuring JVM targets.
Issue 3: freeCompilerArgs
overrides previously set args
It’s not a problem in the generated starter, but if we had something else in our build adding freeCompilerArgs
to the Kotlin compiler, these would be lost when we do freeCompilerArgs = listOf("-Xjsr305=strict")
. We can just add to the list instead by using the +=
operator.
Issue 4: The credentials example would expose secrets in build logs
If you need to use authenticated repositories, read up on credential handling here
Improved build file
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
import org.springframework.boot.gradle.plugin.SpringBootPlugin
plugins {
id("org.springframework.boot") version "3.0.3"
kotlin("jvm") version "1.8.10"
kotlin("plugin.spring") version "1.8.10"
}
repositories {
mavenCentral()
}
dependencies {
implementation(platform(SpringBootPlugin.BOM_COORDINATES))
implementation("org.springframework.boot:spring-boot-starter")
implementation("org.jetbrains.kotlin:kotlin-reflect")
implementation("org.jetbrains.kotlin:kotlin-stdlib-jdk8")
testImplementation("org.springframework.boot:spring-boot-starter-test")
}
kotlin {
target {
compilations.configureEach {
compilerOptions.configure {
freeCompilerArgs.add("-Xjsr305=strict")
}
}
}
jvmToolchain {
languageVersion.set(JavaLanguageVersion.of("17"))
}
}
tasks.withType<Test>().configureEach {
useJUnitPlatform()
}