一、升级前准备

1、升级JDK

JDK17的下载,我选择的是17.0.8版本,Windows的选择如下:
在这里插入图片描述
JDK的安装,安装后的目录结构如下:

从网上了解到,因为JDK本身已经模块化了,现在不区分JDK和JRE了,JDK9之后没有JRE了(我之前用的是JDK1.8),所以JDK17安装过程中没有JDK1.8安装时候需要选择是否单独安装JRE那个步骤。

在这里插入图片描述
环境变量的配置如下:
在这里插入图片描述
打开cmd,用命令 java -version 检查是否设置成功
在这里插入图片描述

我这次升级到Java17的项目只是其中一部分,还有一部分还是用的Java1.8,所以要考虑到两个版本JDK共存,这里提供两种使用方式:

  1. 直接在环境变量JAVA_HOME中修改路径,用哪个版本就用哪个的路径:
    在这里插入图片描述

  2. JDK1.8与jdk17并存,在对应的编码工具里面添加JDK17,例如这里,我在idea中添加JDK17,然后再把项目对应的SDK换成Java17就行:
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述

2、升级IntelliJ IDEA

首先要查看IDEA版本和JDK版本对应关系:
链接: https://www.jetbrains.com/help/idea/supported-java-versions.html#2023

IntelliJ IDEA发行版本:

链接: https://www.jetbrains.com/idea/download/other.html

以下是整理的一部分,作为参考:
在这里插入图片描述
如果是需要IDEA下载、安装、配置教程的,可以看我另外一篇文章:
链接: https://blog.csdn.net/weixin_50993955/article/details/132320485?spm=1001.2014.3001.5501

我此次是直接将IntelliJ IDEA从2020.1升级到2023.2,也就是当前最新版本,升级后遇到两个问题,一个是新建类的时候报错,并且新建的类变成 .Java文件,如下:
在这里插入图片描述
还有一个是运行项目时IDEA报错,报错信息如下:
在这里插入图片描述
最后发现是之前卸载IDEA2020.1版本时候把插件和配置留了下来,没清除,升级2023.2后沿用了之前的配置,一个名为codota的插件不兼容导致的,将该插件停用后能正常创建包和类,运行不再报错:
在这里插入图片描述

二、相关配置

1、设置中的Java编译器,需要修改字节码版本

在这里插入图片描述

2、项目结构中的版本设置

在这里插入图片描述

3、JVM参数的添加

本次添加的jvm参数如下(如果还涉及其他参数,请自行添加):

--add-exports=java.base/sun.nio.ch=ALL-UNNAMED
--add-opens=java.base/java.lang=ALL-UNNAMED
--add-opens=java.base/java.lang.reflect=ALL-UNNAMED
--add-opens=java.base/java.io=ALL-UNNAMED
--add-exports=jdk.unsupported/sun.misc=ALL-UNNAMED
--add-opens=java.base/java.time=ALL-UNNAMED

本人试了一下,针对网上推荐的两种配置方式,方式一针对某个应用配置jvm参数,这种方式成功了;方式二中通过idea配置全局参数的方式失败了,参数没生效

方式一:
针对某个应用配置JVM参数

第一步:选择Run下面的Edit Configurations… ,或者点击后面运行框中的Edit Configurations…
在这里插入图片描述

第二步:第一步打开后,出现如下界面,点击Modify option(修改选项),然后选择右侧的Add VM options
在这里插入图片描述
第三步:这时会出现一个VM options的输入框,在VM options输入框中输入jvm参数
在这里插入图片描述

照图中配置完,重新运行项目就行了。

方式二:
idea设置全局的JVM参数

第一步:在菜单栏Help下选择Edit Customer VM Options…
在这里插入图片描述

第二步:打开后,可以看到一些默认的参数配置,修改默认的配置的值,或者添加自己的配置
在这里插入图片描述

第三步:重启idea
**方式二配置完重启IDEA后,运行依然报下面的错误,说明配置没生效,请知道的大佬指点一二

在这里插入图片描述

4、修改maven配置

如果项目中使用的是本地配置的maven,也需要修改
在这里插入图片描述

三、升级后的兼容问题

从Java 8换成Java 17,并不是简单的升级,还需要考虑到升级后的容性问题:

  • 模块化: 从Java 9开始,Java SE平台被模块化,这意味着一些原来公开的API可能被封装在不同的模块 中,导致访问不到。例如,一些框架或库可能使用反射来访问Java内部的API,这在Java 17中默认是不允许的。要解决这个问题,可以使用–add-exports或–add-opens等命令行参数来打开特定模块的特定包,或者使用–illegal-access参数来允许非法的反射访问。
  • 废弃和移除: 从Java 9到Java 17,一些工具、组件、API和特性被废弃或移除了,这可能导致编译或运行时出现错误。例如,Applet API、Nashorn JavaScript引擎、CORBA模块、JDK Flight Recorder等都被移除了。要解决这个问题,可以查看每个版本的迁移指南,了解哪些内容被废弃或移除了,以及如何替换它们。
  • 行为变化: 从Java 9到Java 17,一些API或特性的行为发生了变化,这可能导致运行时出现不一致或异常。例如,正则表达式匹配、安全管理器、字符编码、垃圾收集器等都有一些行为变化。要解决这个问题,也可以查看每个版本的迁移指南,了解哪些内容发生了行为变化,以及如何适应它们。

下面举例一些运行项目时报的错:

程序包javax.servlet.http不存在
程序包javax.validation不存在
[ERROR] 找不到符号
[ERROR]   符号:   类 EnableEurekaClient
[ERROR]   位置: 程序包 org.springframework.cloud.netflix.eureka
[ERROR]  对于RetryableException(int,java.lang.String,feign.Request.HttpMethod,java.util.Date), 找不到合适的构造器
[ERROR]     构造器 feign.RetryableException.RetryableException(int,java.lang.String,feign.Request.HttpMethod,java.lang.Throwable,java.util.Date,feign.Request)不适用
[ERROR]       (实际参数列表和形式参数列表长度不同)
[ERROR]     构造器 feign.RetryableException.RetryableException(int,java.lang.String,feign.Request.HttpMethod,java.util.Date,feign.Request)不适用
[ERROR]       (实际参数列表和形式参数列表长度不同)
程序包org.junit不存在
程序包org.junit.runner不存在
程序包junit.framework不存在

其他还有很多版本升级后导致的问题,就不一一列举了,总之从Java1.8升级成Java17不是一个简单的过程,需要不断的分析和测试项目,要仔细阅读官方每个版本的迁移文档。

Logo

旨在为数千万中国开发者提供一个无缝且高效的云端环境,以支持学习、使用和贡献开源项目。

更多推荐