JDK1.8升级JDK17笔记.250408

零、将JDK从1.8升级到17的显著优势:

一、安全性增强

  1. 漏洞修复与加密算法升级
    JDK 17修复了JDK 1.8中遗留的多个安全漏洞,例如通过禁用旧版TLS/SSL协议、默认启用更安全的加密算法(如TLSv1.3)来提升网络通信安全性。此外,模块化系统(JPMS)通过强封装限制对内部API的访问,减少了反射滥用导致的安全风险(如FastJSON漏洞场景)。

  2. 数据安全与反序列化控制
    引入特定于上下文的反序列化过滤器,防止恶意数据注入。XML处理方面,通过Apache Santuario 3.0.3增强支持SHA3算法和椭圆曲线加密。

二、语言特性与开发效率提升

  1. 语法简化与新特性

    • 记录类(Records) :简化不可变数据类的声明,减少样板代码。
    • 密封类(Sealed Classes) :限制类或接口的继承范围,增强类型安全。
    • 模式匹配:优化instanceof检查和switch表达式,使代码更简洁。
    • 文本块(Text Blocks) :支持多行字符串声明,提高可读性。
  2. API与工具增强

    • 新增HttpClient支持HTTP/2.0和WebSocket,替代旧版HttpURLConnection
    • 改进Stream API和集合工厂方法(如List.of()),简化集合操作。
    • 引入var局部变量推导和yield关键字,降低编码复杂度。

三、性能优化

  1. 垃圾回收器改进

    • ZGC与Shenandoah GC:将STW(Stop-The-World)时间控制在10毫秒内,适合低延迟场景。
    • G1优化:默认垃圾回收器,优化内存分配和回收效率。
  2. 编译与执行效率

    • JIT编译器增强:Graal JIT编译器提升运行时性能。
    • AOT编译:通过提前编译优化启动速度。

四、生态系统与框架支持

  1. 现代框架依赖
    Spring Boot 3.0、Spring Framework 6.x等主流框架已强制要求JDK 17,支持新特性如响应式编程和模块化开发。Jakarta EE 9+也深度适配JDK 17,推动云原生开发。

  2. 工具链兼容性
    Maven、Gradle等构建工具,以及IntelliJ IDEA、Eclipse等IDE均已全面支持JDK 17。

五、长期维护与成本优化

  1. LTS支持周期
    JDK 17是长期支持版本(LTS),官方维护至2029年,降低企业因频繁升级产生的成本。

  2. 部署与维护简化
    单JDK环境部署替代多版本并存,减少环境复杂度。同时,JDK 17对JDK 8代码保持向下兼容,迁移风险可控。

六、未来技术前瞻性

  1. 本地交互与内存管理
    外部函数和内存API(FFM)支持高效本地代码调用,为高性能计算场景铺路。

  2. 向量API与云原生优化
    提供SIMD指令支持,加速数据并行处理,结合GraalVM可进一步提升云原生应用性能。

总结

升级至JDK 17不仅能够解决历史版本的安全隐患,还能通过新特性提升开发效率,结合性能优化和生态支持,为现代应用提供更稳定、高效的运行环境。尽管需评估兼容性风险,但其长期支持和技术前瞻性使其成为企业级项目的优选。

壹、升级笔记

1、新增依赖

 <dependency>
    <groupId>org.apache.commons</groupId>
    <artifactId>commons-lang3</artifactId>
    <version>3.14.0</version> <!-- 使用最新版本或与项目兼容的版本 -->
</dependency>
<jakarta-version>2.0.0</jakarta-version>
<springdoc-openapi-ui.version>1.7.0</springdoc-openapi-ui.version>
<spring-boot-starter-jdbc.version>3.3.2</spring-boot-starter-jdbc.version>
<dubbo-spring-boot-starter.version>3.2.5 </dubbo-spring-boot-starter.version>
<springdoc-openapi-starter-webmvc-ui>2.2.0</springdoc-openapi-starter-webmvc-ui>
<spring-cloud-starter-bootstrap>4.1.2</spring-cloud-starter-bootstrap>

1、版本升级依赖

 <encoding>UTF-8</encoding>
        <!-- JDK 版本 -->
        <maven.compiler.source>17</maven.compiler.source>
        <maven.compiler.target>17</maven.compiler.target>
        <jdk.version>17</jdk.version>

        <!-- Spring Boot 版本 -->
        <spring-boot.version>3.3.2</spring-boot.version>
        <!-- Spring Cloud 版本 -->
        <spring-cloud.version>2023.0.3</spring-cloud.version>
        <!-- Spring Cloud Alibaba 版本 -->
        <spring-cloud-alibaba.version>2023.0.1.3</spring-cloud-alibaba.version>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        <jakarta-version>2.0.0</jakarta-version>
        <springdoc-openapi-ui.version>2.2.0</springdoc-openapi-ui.version>
        <agent.version>1.0-SNAPSHOT</agent.version>
        <rocketmq.version>2.2.1</rocketmq.version>
        <geodesy.version>1.1.3</geodesy.version>
        <spring-boot-starter-jdbc.version>3.3.2</spring-boot-starter-jdbc.version>
        <knife4j.version>3.0.3</knife4j.version>
        <spring-cloud-starter-bootstrap.version>4.1.2</spring-cloud-starter-bootstrap.version>
        <xxl-job-version>2.3.0</xxl-job-version>
        <skywalking.version>8.12.0</skywalking.version>
        <hutool.version>5.8.22</hutool.version>
        <zxing.version>3.5.2</zxing.version>
        <nacos-client.version>2.2.3</nacos-client.version>
        <nacos.client.version>2023.0.1.3</nacos.client.version>
        <fastjson.version>2.0.32</fastjson.version>
        <commons-lang3.version>3.14.0</commons-lang3.version>
        <mybatis-spring-boot.version>3.0.4</mybatis-spring-boot.version>
        <mybatis-plus-boot.version>3.5.7</mybatis-plus-boot.version>
        <jsqlparser.version>4.9</jsqlparser.version>
        <pagehelper-boot.version>2.1.0</pagehelper-boot.version>
        <mysql-connector>8.0.33</mysql-connector>
        <druid.version>1.2.21</druid.version>
        <log4j.version>2.20.0</log4j.version>
        <lombok.version>1.18.30</lombok.version>
        <dubbo.version>3.2.8</dubbo.version>
        <sentinel-version>1.8.6</sentinel-version>
        <easyexcel.version>3.3.3</easyexcel.version>
        <okhttp3.version>4.12.0</okhttp3.version>
        <junit.version>5.9.3</junit.version>
        <hutool.version>5.8.25</hutool.version>
        <mapstruct.version>1.5.5.Final</mapstruct.version>
         <jwt.version>3.4.0</jwt.version>
        <springdoc-openapi.version>1.7.0</springdoc-openapi.version>
        <spring.version>6.1.11</spring.version>
        <maven-dependency.version>2.8</maven-dependency.version>
        <maven-jar.version>3.3.0</maven-jar.version>
        <maven-resources.version>2.6</maven-resources.version>
        <maven-surefire.version>2.12.4</maven-surefire.version>
        <maven-compiler.version>3.11.0</maven-compiler.version>

修改依赖

 <plugin>
                    <groupId>org.apache.maven.plugins</groupId>
                    <artifactId>maven-compiler-plugin</artifactId>
                    <version>${maven-compiler.version}</version>
                    <configuration>
                        <source>${jdk.version}</source>
                        <target>${jdk.version}</target>
                        <encoding>${encoding}</encoding>
                        <forceJavacCompilerUse>true</forceJavacCompilerUse>
                        <compilerArgs>
                            <arg>-parameters</arg>
                            <!-- 统一参数配置 -->
                            <!-- 新增模块系统参数 -->
                            <arg>--add-modules=jdk.unsupported</arg>
                            <!-- 合并重复的开放指令 -->
                            <arg>--add-exports=java.base/sun.nio.ch=ALL-UNNAMED</arg>
                            <arg>--add-exports=java.base/sun.reflect.generics=ALL-UNNAMED</arg>
                            <arg>--add-opens=java.base/java.lang=ALL-UNNAMED</arg>
                            <arg>--add-opens=java.base/java.io=ALL-UNNAMED</arg>
                            <arg>--add-opens=java.base/java.util=ALL-UNNAMED</arg>
                            <arg>--add-exports=java.base/sun.reflect.generics=ALL-UNNAMED</arg>
                            <arg>--add-opens=java.base/java.lang.reflect=ALL-UNNAMED</arg>
                            <!-- 保留一个lint参数 -->
                            <arg>-Xlint:all</arg>
                        </compilerArgs>
                    </configuration>
                </plugin>

2、naco版本升级配套HttpMethod方法改造

// 替换前
import com.alibaba.nacos.common.utils.HttpMethod; 
// 替换后
import org.springframework.http.HttpMethod;

3、springboot升级后相应注解方式改造

// 替换前
import org.springframework.boot.autoconfigure.web.ResourceProperties;

// 替换后
import org.springframework.boot.autoconfigure.web.WebProperties;
@Configuration
public class ExceptionHandlerConfiguration {
    @Autowired
    private WebProperties.Resources resources; // 直接注入资源配置

    // 其他逻辑...
}

// 原代码
List<String> staticLocations = resourceProperties.getStaticLocations();
// 新代码
List<String> staticLocations = resources.getStaticLocations();

4、springboot升级后对应的yaml文件格式化要求改动

# 原配置
spring:
  resources:
    static-locations: classpath:/static/
    cache:
      period: 3600

# 新配置
spring:
  web:
    resources:
      static-locations: classpath:/static/
      cache:
        period: 3600

5、jdk版本升级后的对应jar包路径改造


// 原代码
import javax.validation.constraints.NotNull;
// 新代码
import jakarta.validation.constraints.NotNull;

// 替换前
import javax.servlet.http.HttpServletRequest;
import javax.servlet.Filter;
// 替换后
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.Filter;

6、springboot接口文档升级后对应依赖路径导入改造

// 替换前
import io.swagger.annotations.ApiModelProperty;
// 替换后
import io.swagger.v3.oas.annotations.media.Schema;

7、springboot升级后对应的注解进行改造

所有@ApiModelProperty注解替换成 @Schema注解

8、项目升级后引入AI功能的配置

新增CatFilter.java、MonitorResponse.java、OpenApiConfig.java文件

9、springboot升级后对应的依赖包修改

import org.apache.commons.lang3.time.DateFormatUtils;

10、springboot升级后对应的测试注解升级

@ExtendWith 注解来替代 @RunWith

11、springboot升级后对应的yaml文件中redis的结构修改

   redis:
    address: redis://xxx.xxx.xxx.xxx:6379
   #访问超时时间
  data:
    redis:
      database: 0
      host: xxx.xxx.xxx.xxx
      port: 6379
      password: 123456
      timeout: 3000
      lettuce:
        pool:
         # 最大活跃链接数 默认8
          max-active: 5
         # 最大空闲连接数 默认8
          max-idle: 10
         # 最小空闲连接数 默认0
          min-idle: 0
          ```

### 12、springboot升级后对应的yaml文件中配置才能与nacos联通
```yaml
  config:
    #使用 optional 关键字,即便 Nacos 服务不可用,应用也能正常启动
    import: optional:nacos:fhs-service-dubbo.yaml

13、springboot升级后对应redis模块升级

新增代码块

   @Bean
   public RedissonClient redissonClient() {
       Config config = new Config();
       config.useSingleServer().setAddress("redis://localhost:6379");
       // 使用Jackson编解码器
       config.setCodec(new JsonJacksonCodec());
       return Redisson.create(config);
   }

14、springboot升级后对应redis依赖包升级

 依赖问题
	   <groupId>org.redisson</groupId>
       <artifactId>redisson</artifactId>
       <version>3.17.5</version>
       <exclusions>
           <exclusion>
               <groupId>de.ruedigermoeller</groupId>
               <artifactId>fst</artifactId>
           </exclusion>
       </exclusions>
   </dependency> 

15、springboot升级后对应的日志文件配置修改

日志配置修改

        <rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
           <!--归档的日志文件,可与当前日志文件分开。%d{yyyy-MM-dd}指定日期格式,%i指定索引-->
           <fileNamePattern>${log.path}/%d{yyyy-MM-dd}/${app_name}-ERROR-%i.log</fileNamePattern>
<!--            <timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">-->
               <maxFileSize>100MB</maxFileSize>
<!--            </timeBasedFileNamingAndTriggeringPolicy>-->
           <!--日志文件保留天数-->
           <maxHistory>30</maxHistory>

16、jdk升级对应的镜像文件升级

DockerFile修改

FROM openjdk:8-jdk-alpine 
# 改成
FROM openjdk:17-alpine

17、springboot升级对应的oauth2中配置信息修改

从server:

  port: 8080
# security:
#   oauth2:
#     client:
#       client-id: UserManagement
#       client-secret: xxx
#       access-token-uri: https://xxx.xxx.cn:8090/oauth/token
#       user-authorization-uri: https://xxx.xxx.cn:8090/oauth/authorize
#     resource:
#       jwt:
#         key-uri: https://xxx.xxx.cn:8090/oauth/token_key

修改成为

spring:
  security:
    oauth2:
      client:
        registration:
          uportal:
            client-id: UserManagement
            client-secret: user123
            authorization-grant-type: authorization_code
            scope: profile, email
            redirect-uri: https://xxx.xxx.cn:8090/login
        provider:
          uportal:
            authorization-uri: https://xxx.xxx.cn:8090/oauth/authorize
            token-uri: https://xxx.xxx.cn:8090/oauth/token
            jwk-set-uri: https://xxx.xxx.cn:8090/oauth/token_key

18、应用修改

web
dubbo:
  application:
    check-serializable: false
    serialize-check-status: DISABLE
     #当前这个应用的信息
    parameters:
      fastjson2.parser.autoTypeSupport: true  
	jackson:
    property-naming-strategy: LOWER_CAMEL_CASE # 强制小驼峰命名
    visibility:
      field: ANY # 确保序列化能读取私有字段
	  
  dubbo.protocol.serialization=fastjson2


  redis:
    address: redis://xxx.xxx.xxx.xxx:6379
    #访问超时时间
  data:
    redis:
      database: 0
      host: xxx.xxx.xxx.xxx
      port: 6379
      password: xxxx
      timeout: 3000
      lettuce:
        pool:
          # 最大活跃链接数 默认8
          max-active: 5
          # 最大空闲连接数 默认8
          max-idle: 10
          # 最小空闲连接数 默认0
          min-idle: 0
		  
		  
	  
dubbo:
  application:
    name: basic_platform-service-dubbo
    check-serializable: false
    serialize-check-status: DISABLE  

19、网关修改

网关异常:When allowCredentials is true, allowedOrigins cannot contain the special value "*" since that cannot be set on the "Access-Control-Allow-Origin" response header. To allow credentials to a set of origins, list them explicitly or consider using "allowedOriginPatterns" instead

网关GwCorsFilter.java修改

   config.setAllowCredentials(true);
   config.addAllowedOriginPattern("*");
posted @ 2025-04-08 10:36  中国的Amadeus  阅读(1308)  评论(0)    收藏  举报