将 Spring Boot 项目从 JDK 8 升级到 JDK 11

Posted

技术标签:

【中文标题】将 Spring Boot 项目从 JDK 8 升级到 JDK 11【英文标题】:Upgrading a Spring Boot project from JDK 8 to JDK 11 【发布时间】:2020-06-17 10:29:21 【问题描述】:

我正在尝试将 Spring Boot 应用程序从 JDK 8 升级到 JDK 11,并进行了以下更改:

1.在pom.xml中使用java.version

<properties>
<java.version>11</java.version>
</properties>

2.为移除的模块添加依赖:

<!--1.JAF(java.activation)-->

<dependency>
<groupId>com.sun.activation</groupId>
<artifactId>javax.activation</artifactId>
</dependency>

<!--2.JTA(java.transaction)-->
<dependency>
<groupId>javax.xml.bind</groupId>
<artifactId>jaxb-api</artifactId>
</dependency>

<!--3.JAXB(java.xml.bind)-->
<!--API-->
<dependency>
<groupId>jakarta.xml.bind</groupId>
<artifactId>jakarta.xml.bind-api</artifactId>
<version>2.3.2</version>
</dependency>

<!--Runtime-->
<dependency>
<groupId>org.glassfish.jaxb</groupId>
<artifactId>jaxb-runtime</artifactId>
</dependency>

<!--4.JAX-WS(java.xml.ws)-->
<!--API-->
<dependency>
<groupId>jakarta.xml.ws</groupId>
<artifactId>jakarta.xml.ws-api</artifactId>
<version>2.3.2</version>
</dependency>

<!--Runtime-->
<dependency>
<groupId>com.sun.xml.ws</groupId>
<artifactId>jaxws-rt</artifactId>
<version>2.3.2</version>
</dependency>

<!--5.CommonsAnnotations(java.xml.ws.annotation)-->
<dependency>
<groupId>javax.annotation</groupId>
<artifactId>javax.annotation-api</artifactId>
</dependency>

3.添加了以下插件:

<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.8.0</version>
<configuration>
<release>11</release>
</configuration>
</plugin>

<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-surefire-plugin</artifactId>
<version>2.22.0</version>
</plugin>

<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-failsafe-plugin</artifactId>
<version>2.22.0</version>
</plugin>

当我运行mvn clean package 时,我得到一个错误:

compiler message file broken:key=compiler.misc.msg.bugarguments=11.0.4-redhat,1,2,3,4,5,6,7
java.lang.***Error
atjdk.compiler/com.sun.tools.javac.comp.Attr.attribTree(Attr.java:652)
atjdk.compiler/com.sun.tools.javac.comp.Attr.visitSelect(Attr.java:3573)
atjdk.compiler/com.sun.tools.javac.tree.JCTree$JCFieldAccess.accept(JCTree.java:2114)
atjdk.compiler/com.sun.tools.javac.comp.Attr.attribTree(Attr.java:655)
atjdk.compiler/com.sun.tools.javac.comp.Attr.visitApply(Attr.java:2006)
atjdk.compiler/com.sun.tools.javac.tree.JCTree$JCMethodInvocation.accept(JCTree.java:1634)

对我做错了什么或我需要做的其他事情有什么想法吗?提前致谢。

【问题讨论】:

看这里:bugs.openjdk.java.net/browse/JDK-8222754 该链接说它已针对 Oracle 和 OpenJDK 的 JDK 11 修复。我正在使用 openjdk 版本“11.0.4-redhat”2019-07-16 LTS - 所以我需要检查它是否仍然是 redhat 版本的问题。谢谢。 【参考方案1】:

我只是通过添加将我的 SpringBoot 项目从 Java 8 版本更新到 Java 16

<properties>
    <java.version>16</java.version>
</properties>

当然,我首先在我的 Mac 上安装了 Java 16 JDK。

并且还在 InteliJ 首选项中设置以运行 Maven

JDK importer: JAVA_HOME(/Library/Java/JavaVirtualMachines/jdk-16.jdk/Contents/Home)

如果你去的话,你可以在 IntelliJ IDEA 中找到它

Preferences &gt; Building, Execution, Deployment &gt; Building Tools &gt; Maven &gt; Importing

Spring Boot 应用程序在 pom.xml 文件的属性标签中指定 JDK 版本。

您的父 POM 允许我们配置默认插件和多个属性,包括 Java 版本 — 默认情况下,Java 版本为 1.8。

但是,我们可以通过指定 java.version 属性来覆盖父级的默认版本:

<properties>
    <java.version>16</java.version>
</properties>

通过设置 java.version 属性,我们声明源和目标 Java 版本都等于 16。

以上步骤仅适用于 SpringBoot 应用程序。

如果需要更新 Spring 应用程序,这些链接可能会有所帮助:

https://www.baeldung.com/maven-java-version

https://maven.apache.org/plugins/maven-compiler-plugin/examples/set-compiler-source-and-target.html

【讨论】:

以上是关于将 Spring Boot 项目从 JDK 8 升级到 JDK 11的主要内容,如果未能解决你的问题,请参考以下文章

使用Idea初始化一个spring boot 项目

Spring Boot框架开发Web项目 Spring Boot项目的打包和部署

Spring Boot框架开发Web项目 Spring Boot项目的打包和部署

从“openjdk:8-jdk-alpine”为 Spring Boot 应用程序构建 docker 映像时无法运行“RUN ./mvnw dependency:go-offline -B”

关于spring boot项目启动报错问题

阿里P9告诉你 Spring Boot 2.0正式发布,升还是不升呢?