jdk8升级jdk17的坑

1,983 阅读2分钟

jdk8升级jdk17

问题一
反射+私有 API 调用之伤,在Java8中没有人能阻止你访问特定的包,对反射也没有限制,只要 setAccessible(true) 就可以了。Java9 模块化以后,一切都变了,只能通过 --add-exports和 --add-opens 来打破模块封装
可以对包进行升级或者启动参数加上如下

--add-opens 导出特定的包
--add-opens 允许模块中特定包的类路径深度反射访问
比如:

--add-opens java.base/java.lang=ALL-UNNAMED 
--add-opens java.base/java.io=ALL-UNNAMED 
--add-opens java.base/java.math=ALL-UNNAMED 
--add-opens java.base/java.net=ALL-UNNAMED 
--add-opens java.base/java.nio=ALL-UNNAMED 
--add-opens java.base/java.security=ALL-UNNAMED 
--add-opens java.base/java.text=ALL-UNNAMED 
--add-opens java.base/java.time=ALL-UNNAMED 
--add-opens java.base/java.util=ALL-UNNAMED 
--add-opens java.base/jdk.internal.access=ALL-UNNAMED 
--add-opens java.base/jdk.internal.misc=ALL-UNNAMED

问题二
maven相关

<maven.compiler.souce>1.8</maven.compiler.source>
<maven.compiler.target>1.8</maven.compiler.target>
改成
<maven.compiler.source>17</maven.compiler.source>
<maven.compiler.target>17</maven.compiler.target>

升级 spring-boot-starter-parent 2.1.5.RELEASE==》3.1.3

<parent>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-parent</artifactId>
    <version>3.1.3</version>
    <relativePath/>
</parent>

升级 springcloud Greenwich.RELEASE==》2022.0.4

<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-dependencies</artifactId>
    <version>2022.0.4</version>
    <scope>import</scope>
    <type>pom</type>
</dependency>

升级 fastjson==》fastjson2

<dependency>
    <groupId>com.alibaba.fastjson2</groupId>
    <artifactId>fastjson2</artifactId>
    <version>2.0.40</version>
</dependency>

import com.alibaba.fastjson.annotation.JSONField; 替换为 import com.alibaba.fastjson2.annotation.JSONField;

JSONObject.parseArray 替换为 JSONArray.parseArray

// 升级不支持 todo
@JSONField(serializeUsing = LongCodec.class)

// 没有各种序列化类,比如redis序列化类 待处理 todo
import com.alibaba.fastjson.serializer.SerializeConfig; 
import com.alibaba.fastjson.serializer.SerializerFeature;
import com.alibaba.fastjson.serializer.ToStringSerializer;
import com.alibaba.fastjson.support.config.FastJsonConfig;
import com.alibaba.fastjson.support.spring.FastJsonHttpMessageConverter;
import com.alibaba.fastjson.support.spring.GenericFastJsonRedisSerializer;
import com.alibaba.fastjson.support.spring.FastJsonRedisSerializer

添加 hibernate-validator
从 Java EE 8 开始,Java EE 规范的维护权移交给了 Eclipse 基金会,并更名为 Jakarta EE

<dependency>
    <groupId>org.hibernate</groupId>
    <artifactId>hibernate-validator</artifactId>
    <version>8.0.1.Final</version>
</dependency>
hibernate中包含jakarta包
javax.annotation.Resource 替换为 jakarta.annotation.Resource
javax.servlet.http.HttpServletRequest 替换为 jakarta.servlet.http.HttpServletRequest
javax.servlet.http.HttpServletResponse 替换为 jakarta.servlet.http.HttpServletResponse
import javax.validation.constraints.NotBlank; 替换为 import jakarta.validation.constraints.NotBlank;

升级lombok

maven打包报错
class lombok.javac.apt.LombokProcessor (in unnamed module @0x63a6dffd) cannot access class com.sun.tools.javac.processing.JavacProcessingEnvironment (in module jdk.compiler) because module jdk.compiler does not export com.sun.tools.javac.processing to unnamed module @0x63a6dffd
<dependency>
    <groupId>org.projectlombok</groupId>
    <artifactId>lombok</artifactId>
    <version>1.18.12</version>
</dependency>
改成 
<dependency>
    <groupId>org.projectlombok</groupId>
    <artifactId>lombok</artifactId>
    <version>1.18.30</version>
</dependency>

升级 mysql

# Property 'sqlSessionFactory' or 'sqlSessionTemplate' are required报这个异常这些都要升级
<mybatis.spring>3.0.2</mybatis.spring>
<mapper.version>4.2.3</mapper.version>
<druid.version>1.2.19</druid.version>
<mysql.version>8.0.33</mysql.version>
<dependency>
    <groupId>org.mybatis.spring.boot</groupId>
    <artifactId>mybatis-spring-boot-starter</artifactId>
    <version>${mybatis.spring}</version>
</dependency>
 <dependency>
    <groupId>tk.mybatis</groupId>
    <artifactId>mapper-spring-boot-starter</artifactId>
    <version>${mapper.version}</version>
    <exclusions>
        <exclusion>
            <groupId>org.mybatis</groupId>
            <artifactId>mybatis-spring</artifactId>
        </exclusion>
    </exclusions>
</dependency>
<dependency>
    <groupId>com.mysql</groupId>
    <artifactId>mysql-connector-j</artifactId>
    <version>8.1.0</version>
</dependency><dependency>
    <groupId>mysql</groupId>
    <artifactId>mysql-connector-java</artifactId>
    <version>8.0.33</version>
</dependency>

# Error creating bean with name 'sqlSessionFactory' defined in class path resource 报这个异常检查下mybatis-spring这个包版本
<dependency>
    <groupId>tk.mybatis</groupId>
    <artifactId>mapper-spring-boot-starter</artifactId>
    <version>${mapper.version}</version>
    <exclusions>
        <exclusion>
            <groupId>org.mybatis</groupId>
            <artifactId>mybatis-spring</artifactId>
        </exclusion>
    </exclusions>
</dependency>
spring.datasource.type=com.alibaba.druid.pool.DruidDataSource
spring.datasource.druid.driver-class=com.mysql.jdbc.Driver 替换为 spring.datasource.druid.driver-class-name=com.mysql.jdbc.Driver

升级 redis 2.1.5.RELEASE==》3.1.3

<dependency>
          <groupId>org.springframework.boot</groupId>
          <artifactId>spring-boot-starter-data-redis</artifactId>
          <version>3.1.3</version>
      </dependency>
redis配置修改
老:
spring.redis.host=127.0.0.1
spring.redis.port=6380
spring.redis.password=pwd
新:
spring.data.redis.host=127.0.0.1
spring.data.redis.port=6380
spring.data.redis.password=pwd

升级feign 2.1.0.RELEASE==》4.0.4

<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-openfeign</artifactId>
    <version>4.0.4</version>
</dependency>
@RequestMapping annotation not allowed on @FeignClient interface 去掉@FeignClient上的@RequestMapping。

升级xxl-job 2.0.1==》2.4.0

<dependency>
    <groupId>com.xuxueli</groupId>
    <artifactId>xxl-job-core</artifactId>
    <version>2.4.0</version>
</dependency>
报Could not initialize class org.codehaus.groovy.vmplugin.v7.Java7,可能是由于xxl-job版本过低,升级一下版本就好了

添加 guava

<dependency>
    <groupId>com.google.guava</groupId>
    <artifactId>guava</artifactId>
    <version>32.1.2-jre</version>
</dependency>
import com.google.common.collect.Lists;报这个包不存在引上面的包

泛型异常修改

public <T> List<T> getValueList(Object key) {
    BoundValueOperations<String, List<T>> operations = redisTemplate.boundValueOps(key);
    ObjectMapper mapper = new ObjectMapper();
    return mapper.convertValue(operations.get(), new TypeReference<T>() {
    });
}
改成
public <T> List<T> getValueList(Object key) {
    BoundValueOperations<String, List<T>> operations = redisTemplate.boundValueOps(key);
    ObjectMapper mapper = new ObjectMapper();
    TypeReference<List<T>> typeRef = new TypeReference<>() {};
    return mapper.convertValue(operations.get(), typeRef);
}
推论变量 T 具有不兼容的上限  报这个异常按上面这样改

加密类修改

import sun.misc.BASE64Encoder;
BASE64Encoder encoder = new BASE64Encoder();
改成
Base64.Encoder encoder = Base64.getEncoder();

去掉apollo

<dependency>
    <groupId>com.ctrip.framework.apollo</groupId>
    <artifactId>apollo-client</artifactId>
</dependency>

升级 nacos 2.1.4.RELEASE==>2022.0.0.0 nacos服务要更新到2.0

No spring.config.import property has been defined
<!--SpringBoot 2.4版本之后 SpringCloud 2020,需要引入该依赖,才能读取bootstrap文件-->
<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-bootstrap</artifactId>
</dependency>

<dependency>
    <groupId>com.alibaba.cloud</groupId>
    <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
    <version>2022.0.0.0</version>
</dependency>
<dependency>
    <groupId>com.alibaba.cloud</groupId>
    <artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
    <version>2022.0.0.0</version>
</dependency>

去掉多余的nacos包
<dependency>
    <groupId>com.alibaba.nacos</groupId>
    <artifactId>nacos-api</artifactId>
    <version>${nacos.version}</version>
</dependency>
NoClassDefFoundError: com/alibaba/nacos/client/logging/NacosLogging去掉下面这个包就好了
<dependency>
    <groupId>com.alibaba.nacos</groupId>
    <artifactId>nacos-client</artifactId>
</dependency>
<dependency>
    <groupId>com.alibaba.nacos</groupId>
    <artifactId>nacos-common</artifactId>
</dependency>
bootstrap.yaml配置调整(主的不改分环境的改下)
老:
spring:
 profiles:
    active: local
新:
spring:
  config:
    activate:
      on-profile: local

循环依赖

spring.main.allow-circular-references=true

去除swagger

去掉
<!--swagger-->
<dependency>
    <groupId>io.springfox</groupId>
    <artifactId>springfox-swagger2</artifactId>
</dependency>
<dependency>
    <groupId>io.swagger</groupId>
    <artifactId>swagger-models</artifactId>
</dependency>
<dependency>
    <groupId>io.springfox</groupId>
    <artifactId>springfox-swagger-ui</artifactId>
</dependency>
Error creating bean with name 'documentationPluginRegistry': FactoryBean threw exception on object creation
去掉注解 @EnableSwagger2
去掉
import com.fasterxml.jackson.annotation.JsonFormat;
import io.swagger.annotations.ApiModelProperty;
去掉 
@ApiModelProperty("主键")
@ApiModelProperty(value = TypeEnum.DESC);

引入smart-doc

<dependency>
    <groupId>org.springdoc</groupId>
    <artifactId>springdoc-openapi-starter-webmvc-ui</artifactId>
    <version>2.2.0</version>
</dependency>
<dependency>
    <groupId>org.springdoc</groupId>
    <artifactId>springdoc-openapi-starter-webmvc-api</artifactId>
    <version>2.2.0</version>
</dependency>

添加

import com.google.common.collect.Lists;
import com.google.common.collect.Maps;
import com.google.common.collect.Sets;
swagger-forx啥的去掉没有这个包了 引入下面这个
<dependency>
    <groupId>com.google.guava</groupId>
    <artifactId>guava</artifactId>
    <version>32.1.2-jre</version>
</dependency>

Pair类不兼容jdk17

java: 程序包javafx.util不存在
替换成
public static Map.Entry<Date, Date> getStartAndEndDate(int year) {
    LocalDateTime startLocalTime = LocalDateTime.of(LocalDate.now().getYear() - year, 1, 1, 0, 0, 0);
    LocalDateTime endLocalTime = LocalDateTime.of(LocalDate.now().getYear(), 12, 31, 23, 59, 59);
    Date startDate = Date.from(startLocalTime.atZone(ZoneId.systemDefault()).toInstant());
    Date endDate = Date.from(endLocalTime.atZone(ZoneId.systemDefault()).toInstant());
    return new AbstractMap.SimpleEntry<>(startDate, endDate);
}