背景
:参看 《升级程序到Java21的记录一(先升级jdk到21)》, Jdk升级完毕,下面我们该秀修改程序源代码了, 程序最初使用的springboot2.6.8 以及jdk17。为了使用springboot 3.0(3.0开始有支持虚拟线程的相关配置)和java21相关语法,源代码需要一定改动, 本文记录源代码的相关改动。
具体改动
1,升级工程的gradle
笔者的程序使用gradle做构建,为了支持java21,需要升级gradle版本。
在工程根目录下执行gradle wrapper --gradle-version=8.5, 升级到gradle 8.5, 该版本支持java21
2, 升级lombok版本
参看 https://stackoverflow.com/questions/77171270/compilation-error-after-upgrading-to-jdk-21-nosuchfielderror-jcimport-does-n
升级gradle到8.5 后执行gradle bootJar发现报错
Execution failed for task ':compileJava'.
> java.lang.NoSuchFieldError: Class com.sun.tools.javac.tree.JCTree$JCImport does not have member field 'com.sun.tools.javac.tree.JCTree qualid'
* Try:
升级到对应版本lombok
3,升级springboot版本
从springboot 2.7.18 开始支持java21, 笔者程序使用的springboot 2.6.8,直接构建为java21的报错如下。
命令:gradle bootJar --stacktrace
具体springboot升级改动的内容参看官方文档:
https://mvnrepository.com/artifact/org.springframework.boot/spring-boot-gradle-plugin/3.2.0
https://docs.spring.io/spring-boot/docs/2.7.x/reference/html/getting-started.html
https://github.com/spring-projects/spring-boot/wiki/Spring-Boot-3.0-Migration-Guide 重点是这个。 升级只有一些对应http 参数校验也发生一遍变化, 例如之前的@NotEmpty对query parameter不生效,现在都开始生效了,
之前的springboot版本信息:
buildscript {
repositories {
maven {
url "https://plugins.gradle.org/m2/"
}
}
dependencies {
classpath "org.springframework.boot:spring-boot-gradle-plugin:2.6.8"
classpath "io.spring.gradle:dependency-management-plugin:1.0.11.RELEASE"
classpath "com.netflix.nebula:gradle-lint-plugin:17.7.1"
}
}
升级后的springboot版信息。 笔者直接升级到当时的springboot3的最新版本 3.2.2
buildscript {
repositories {
maven {
url "https://plugins.gradle.org/m2/"
}
}
dependencies {
// https://mvnrepository.com/artifact/org.springframework.boot/spring-boot-gradle-plugin/3.2.2
classpath "org.springframework.boot:spring-boot-gradle-plugin:3.2.2"
// https://mvnrepository.com/artifact/io.spring.dependency-management/io.spring.dependency-management.gradle.plugin
classpath 'io.spring.dependency-management:io.spring.dependency-management.gradle.plugin:1.1.4'
classpath "com.netflix.nebula:gradle-lint-plugin:17.7.1"
}
}
4,升级一些依赖包
单测依赖的com.github.javafaker:javafaker升级后报错了,直接禁用javafaker包,使用同等功能的 ‘net.datafaker:datafaker:1.5.0’
单测报错,需要升级 junit的版本
https://stackoverflow.com/questions/60471228/junit-java-lang-nosuchmethoderror-org-junit-jupiter-api-extension-extensioncont
升级后yaml解析有报错,添加了对应 testImplementation ‘org.yaml:snakeyaml:2.0’
5,修改build.gradle
增加编译为java21的配置
java {
sourceCompatibility = JavaVersion.VERSION_21
targetCompatibility = JavaVersion.VERSION_21
}
到此,源代码对应的改动结束,如果你使用preview功能,需要在build.gradle中增加如下功能
tasks.withType(JavaCompile) {
options.compilerArgs += "--enable-preview"
}
tasks.withType(Test) {
jvmArgs += "--enable-preview"
}
tasks.withType(JavaExec) {
jvmArgs += "--enable-preview"
}
使用gradle bootJar构建,检查生成的class文件,可以发现已经是java21对应版本,可以修改配置文件开启的虚拟线程, 并在程序启动检查日志
6,检查日志
启动程序,发现已经使用虚拟线程。 可以使用自己的业务性能基准测试验证性能的提升。