将 Spring Boot 应用程序迁移到最新的 Java 版本 (Java 15)
Posted
技术标签:
【中文标题】将 Spring Boot 应用程序迁移到最新的 Java 版本 (Java 15)【英文标题】:Migrating Spring Boot Applications to the Latest Java Version (Java 15) 【发布时间】:2021-03-03 14:20:04 【问题描述】:我设置了一个使用 Java 8 和 Kotlin 的 Spring Boot 项目。我想将项目迁移到 Java 15,但遗憾的是我没有找到任何对此有用的文档。
到目前为止,我能够将我的 Spring boot 版本从 2.3.3.RELEASE 升级到版本 2.4.0,并根据使用 spring initializr 创建的项目示例在 jvmTarget 中引用项目以使用 Java 14。
但是,我没有找到升级到 Java 15 的方法。任何想法都将不胜感激。
这就是我的 build.gradle 的样子:
import org.jetbrains.kotlin.gradle.tasks.KotlinCompile
import java.lang.System.getenv
buildscript
repositories
maven
url = uri("https://plugins.gradle.org/m2/")
dependencies
classpath("org.jmailen.gradle:kotlinter-gradle:3.0.2")
plugins
id("org.springframework.boot") version "2.4.0"
id("io.spring.dependency-management") version "1.0.10.RELEASE"
kotlin("jvm") version "1.4.0"
kotlin("plugin.spring") version "1.4.0"
id ("org.owasp.dependencycheck") version "5.3.2"
id ("com.github.spotbugs") version "4.5.0"
id ("org.jmailen.kotlinter") version "3.0.2"
`jacoco`
tasks.named<org.springframework.boot.gradle.tasks.run.BootRun>.
("bootRun")
args("--spring.profiles.active=local")
jacoco
toolVersion = "0.8.6"
group = "au.project"
version = "0.0.1-SNAPSHOT"
java.sourceCompatibility = JavaVersion.VERSION_1_8
repositories
mavenCentral()
maven
url = uri("https://...")
credentials
username = getenv("ARTIFACTORY_USER")
password = getenv("ARTIFACTORY_PASSWORD")
dependencies
implementation("org.springframework.boot:spring-boot-starter-
webflux")
implementation("com.fasterxml.jackson.module:jackson-module-
kotlin")
implementation("io.github.microutils:kotlin-logging:1.8.3")
implementation("io.projectreactor.kotlin:reactor-kotlin-
extensions")
implementation("org.jetbrains.kotlin:kotlin-reflect")
implementation("org.jetbrains.kotlin:kotlin-stdlib-jdk8")
implementation("org.jetbrains.kotlinx:kotlinx-coroutines-reactor")
implementation("org.owasp:dependency-check-gradle:5.3.2")
implementation("org.springdoc:springdoc-openapi-kotlin:1.4.8")
implementation("org.springdoc:springdoc-openapi-webflux-ui:1.4.8")
developmentOnly("org.springframework.boot:spring-boot-devtools")
testImplementation("org.springframework.boot:spring-boot-starter-
test")
exclude(group = "org.junit.vintage", module = "junit-vintage-engine")
testImplementation("io.projectreactor:reactor-test")
testImplementation("com.github.tomakehurst:wiremock-jre8:2.27.2")
testImplementation("com.openpojo:openpojo:0.8.6")
tasks.withType<Test>
useJUnitPlatform()
tasks.withType<KotlinCompile>
kotlinOptions
freeCompilerArgs = listOf("-Xjsr305=strict")
jvmTarget = "14"
....
注意:在 build.gradle 中更改 kotlinOptions 属性的 jvmTarget = 15,我得到以下异常:“未知 JVM 目标版本:15 支持的版本:1.6、1.8、9、10、11、12、12 ,14. 是否意味着 Kotlin 不支持 Java 15?
【问题讨论】:
你下载 JDK 15 了吗? 到底是什么问题?您是否尝试将 jvm 目标升级到 15?你有错误吗? 【参考方案1】:JDK 15 需要 Gradle 6.7.x,如果您还没有这样做,请先更新 Gradle。
我建议您使用 Gradle 的新 toolchain 功能。它将下载所需的 JDK 来构建您的代码,如果它无法在主机系统上检测到它,以确保使用所需的 JDK 版本执行构建。这也简化了混合团队在不同环境中的正确构建。
java
toolchain
// automatically download a jdk for the build if not available
languageVersion.set(JavaLanguageVersion.of(11))
这不能与java.sourceCompatibility
和java.targetCompatibility
一起使用,您需要删除这些配置。
【讨论】:
谢谢@Simulant,这是否意味着如果主机只有Java 15,那将是工具链Gradle 为我的应用程序配置的那个? 还有一件事,当我在 build.gradle 中更改 kotlinOptions 属性的 jvmTarget = 15 时,我收到以下异常:“未知 JVM 目标版本:15 支持的版本:1.6、1.8、 9,10,11,12,12,14。这是否意味着 Kotlin 不支持 Java 15?如果我使用工具链,我应该如何处理该属性? 是的,我猜这意味着 Kotlin 编译器还不支持 JDK 15。您可以使用任何较低的值。出于长期支持的原因,我建议使用 11 而不是 14。 Gradle?我使用 Maven 的 Java 15 spring-bopt-app。我会因为使用 Maven 而遇到问题吗?【参考方案2】:首先,您需要升级到最新版本的Gradle,即(6.7.x)以支持JDK 15。
在 build.gradle 中添加或更新以下行:
java.sourceCompatibility = JavaVersion.VERSION_15
java.targetCompatibility = JavaVersion.VERSION_15
【讨论】:
@D.B 这有用吗? 谢谢@Anish B。问题,我的 build.gradle 文件没有 targetCompatibility,除了已经存在的 sourceCompatibility 之外,我还需要添加什么吗? 当我在 build.gradle 中更改 kotlinOptions 属性的 jvmTarget = 15 时,出现以下异常:“未知 JVM 目标版本:15 支持的版本:1.6、1.8、9,10, 11,12,12,14.是不是意味着Kotlin不支持Java 15? @D.B 我想是的。以上是关于将 Spring Boot 应用程序迁移到最新的 Java 版本 (Java 15)的主要内容,如果未能解决你的问题,请参考以下文章
将 Spring boot 1.5 迁移到 2.x 无法启动应用程序
Spring Boot Flyway 将数据库迁移应用到错误的数据库
迁移到 JDK 11 后 Spring Boot 测试中的 Mockito 错误
将带有 JMS (ActiveMQ) 的 Spring Boot 应用程序迁移到 GCP 的 pub-sub