将 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.sourceCompatibilityjava.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

Spring Boot - MySQL 到 Postgres 的迁移

将 Waffle Spring Security XML 配置迁移到 Spring Boot