Skip to content

Upgrade to Kotlin 2.2.0 #46238

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Closed
wants to merge 1 commit into from
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -54,7 +54,7 @@ class KotlinConventions {

private static final JvmTarget JVM_TARGET = JvmTarget.JVM_17;

private static final KotlinVersion KOTLIN_VERSION = KotlinVersion.KOTLIN_2_1;
private static final KotlinVersion KOTLIN_VERSION = KotlinVersion.KOTLIN_2_2;

void apply(Project project) {
project.getPlugins().withId("org.jetbrains.kotlin.jvm", (plugin) -> {
Expand All @@ -70,7 +70,8 @@ private void configure(KotlinCompile compile) {
compilerOptions.getLanguageVersion().set(KOTLIN_VERSION);
compilerOptions.getJvmTarget().set(JVM_TARGET);
compilerOptions.getAllWarningsAsErrors().set(true);
compilerOptions.getFreeCompilerArgs().addAll("-Xsuppress-version-warnings");
compilerOptions.getFreeCompilerArgs()
.addAll("-Xsuppress-version-warnings", "-Xannotation-default-target=param-property");
}

private void configureDokkatoo(Project project) {
Expand Down
2 changes: 1 addition & 1 deletion gradle.properties
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,7 @@ hamcrestVersion=3.0
jacksonVersion=2.19.1
javaFormatVersion=0.0.47
junitJupiterVersion=5.13.1
kotlinVersion=2.1.0
kotlinVersion=2.2.0
mavenVersion=3.9.10
mockitoVersion=5.17.0
nativeBuildToolsVersion=0.10.6
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -15,9 +15,10 @@ Feel free to join the #spring channel of https://slack.kotlinlang.org/[Kotlin Sl
[[features.kotlin.requirements]]
== Requirements

Spring Boot requires at least Kotlin 2.1.x and manages a suitable Kotlin version through dependency management.
Spring Boot requires at least Kotlin 2.2.x and manages a suitable Kotlin version through dependency management.
To use Kotlin, `org.jetbrains.kotlin:kotlin-stdlib` and `org.jetbrains.kotlin:kotlin-reflect` must be present on the classpath.
The `kotlin-stdlib` variants `kotlin-stdlib-jdk7` and `kotlin-stdlib-jdk8` can also be used.

Kotlin 2.2.x introduces https://kotlinlang.org/docs/whatsnew22.html#new-defaulting-rules-for-use-site-annotation-targets[new defaulting rules for propagating annotations to parameters, fields, and properties]. In order to avoid related warnings and use what will likely become the Kotlin default behavior in an upcoming version, it is recommended to configure the `-Xannotation-default-target=param-property` compiler flag.

Since https://discuss.kotlinlang.org/t/classes-final-by-default/166[Kotlin classes are final by default], you are likely to want to configure {url-kotlin-docs}/compiler-plugins.html#spring-support[kotlin-spring] plugin in order to automatically open Spring-annotated classes so that they can be proxied.

Expand All @@ -39,15 +40,13 @@ Kotlin also allows using functional constructs with nullable values as described

Although Java does not allow one to express null-safety in its type system, Spring Framework, Spring Data, and Reactor now provide null-safety of their API through tooling-friendly annotations.
By default, types from Java APIs used in Kotlin are recognized as {url-kotlin-docs}/java-interop.html#null-safety-and-platform-types[platform types] for which null-checks are relaxed.
{url-kotlin-docs}/java-interop.html#jsr-305-support[Kotlin's support for JSR 305 annotations] combined with nullability annotations provide null-safety for the related Spring API in Kotlin.
{url-kotlin-docs}/java-interop.html#nullability-annotations[Kotlin's support for nullability annotations] provides null-safety for the annotated APIs like Spring's one in Kotlin.

The JSR 305 checks can be configured by adding the `-Xjsr305` compiler flag with the following options: `-Xjsr305={strict|warn|ignore}`.
The https://jspecify.dev[JSpecify] strict checks are https://kotlinlang.org/docs/whatsnew21.html#change-of-jspecify-nullability-mismatch-diagnostics-severity-to-strict[enabled by default], while the JSR 305 checks can be configured by adding the `-Xjsr305` compiler flag with the following options: `-Xjsr305={strict|warn|ignore}`.
The default behavior is the same as `-Xjsr305=warn`.
The `strict` value is required to have null-safety taken in account in Kotlin types inferred from Spring API but should be used with the knowledge that Spring API nullability declaration could evolve even between minor releases and more checks may be added in the future).

WARNING: Generic type arguments, varargs and array elements nullability are not yet supported.
See https://jira.spring.io/browse/SPR-15942[SPR-15942] for up-to-date information.
Also be aware that Spring Boot's own API is {url-github-issues}/10712[not yet annotated].
WARNING: Be aware that Spring Boot's own API is {url-github-issues}/10712[not yet annotated].



Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -35,7 +35,6 @@
import org.gradle.testkit.runner.GradleRunner;
import org.jetbrains.kotlin.gradle.model.KotlinProject;
import org.jetbrains.kotlin.gradle.plugin.KotlinCompilerPluginSupportPlugin;
import org.jetbrains.kotlin.gradle.plugin.KotlinPlatformJvmPlugin;
import org.jetbrains.kotlin.project.model.LanguageSettings;
import org.jetbrains.kotlin.tooling.core.KotlinToolingVersion;
import org.tomlj.Toml;
Expand Down Expand Up @@ -85,7 +84,6 @@ private List<File> pluginClasspath() {
classpath.add(new File(pathOfJarContaining(DependencyManagementPlugin.class)));
if (this.kotlin) {
classpath.add(new File(pathOfJarContaining("org.jetbrains.kotlin.cli.common.PropertiesKt")));
classpath.add(new File(pathOfJarContaining(KotlinPlatformJvmPlugin.class)));
classpath.add(new File(pathOfJarContaining(KotlinProject.class)));
classpath.add(new File(pathOfJarContaining(KotlinToolingVersion.class)));
classpath.add(new File(pathOfJarContaining("org.jetbrains.kotlin.build.report.metrics.BuildTime")));
Expand Down