设为首页 加入收藏

TOP

JDK 17 营销初体验 —— 亚毫秒停顿 ZGC 落地实践(二)
2023-08-26 21:11:08 】 浏览:80
Tags:JDK ZGC
;javax.annotation-api</artifactId> <version>1.3.1</version> </dependency> <dependency> <groupId>javax.xml.bind</groupId> <artifactId>jaxb-api</artifactId> <version>2.3.0</version> </dependency> <dependency> <groupId>com.sun.xml.bind</groupId> <artifactId>jaxb-impl</artifactId> <version>2.3.0</version> </dependency> <dependency> <groupId>com.sun.xml.bind</groupId> <artifactId>jaxb-core</artifactId> <version>2.3.0</version> </dependency> <dependency> <groupId>javax.activation</groupId> <artifactId>activation</artifactId> <version>1.0.2</version> </dependency>

升级外部中间件

解决了编译找不到类的问题,接下来就该升级依赖的外部中间件了。对于我们的应用来说,也就是升级 SpringBoot 的版本。支持 JDK 17 的版本是 Spring 5.3,对应 SpringBoot 2.5。

在这里我建议升级至 SpringBoot 2.7,从 2.5 升级至 2.7 几乎没有需要改动的地方,同时高版本的 SprngBoot 所约定的依赖,对 JDK 17 的支持也更好。

建议进行大版本逐个升级,比如我们从 2.0 升级至 2.1。每升一个版本,就要仔细观察依赖版本的变化,掌握每个依赖升级的情况。SpringBoot 的升级其实意味着把所有开源组件约定版本进行大版本升级,接口弃用,破坏性兼容更新较多,需要一一鉴别。

下面以升级 Spring Boot 2.1 为例,说明我们升级的步骤:

  1. 首先阅读 Spring Boot 2.1 做了哪些和我们有关的配置改动

  2. 禁用了同 Bean 覆盖,开启需要指定spring.main.allow-bean-definition-overridingtrue

  3. 然后阅读 Spring Boot 2.1 升级了哪些我们用到的依赖

    1. Spring 升级至 5.1

      1. 首先阅读 Spring 5.1 做了哪些和我们有关的配置改动

        1. 无影响
      2. 然后阅读 Spring 5.1 升级了哪些我们用到的依赖

        1. ASM 7.0

          1. 同理,阅读升级影响(这种底层依赖的底层依赖,如果仅 ASM 在使用,则无需关心)
        2. CGLIB 3.2

          1. 同理,阅读升级影响(这种底层依赖的底层依赖,如果仅 ASM 在使用,则无需关心)
      3. 最后阅读 Spring 5.1 弃用了哪些和我们有关的配置与依赖

        1. 无影响
    2. Lombok 升级至 1.18

      1. 阅读改动影响,1.18 Lombok 默认情况下将不再生成私有无参构造函数。可以通过在 lombok.config 配置文件中设置 lombok.noArgsConstructor.extraPrivate=true 来启用它
    3. Hibernate 升级至 5.3

      1. 阅读改动影响,对我们项目无影响
    4. JUnit 升级至 5.2

      1. 阅读改动影响,需要 Surefire 插件升级至 2.21.0及以上
  4. 最后阅读 Spring Boot 2.1 弃用了哪些和我们有关的配置与依赖

至此,Spring Boot 2.1 升级完毕。接下来分析一次依赖树变化,和升级前的依赖树进行比较,查看依赖变化范围是否全部已知可控。完成后进行 Spring Boot 2.2 的升级。

以下为我们需要注意的升级事项,仅供参考:

  • 可以先升级到 JDK 11,一边启动一边验证。但不要在 JDK 11 使用 ZGC,ZGC 的堆预留与可用堆的比例太大,有时会导致 OOM

  • 代码中存在同 Bean,启动时 Springboot 2.0 会自动进行覆盖,高版本开启覆盖,需要指定spring.main.allow-bean-definition-overridingtrue

  • Spring Boot 2.2 默认的单元测试 Junit 升级至 5,Junit 4 的单元测试建议进行升级,改动不大

  • Spring Boot 2.4 不再支持 Junit 4 的单元测试,如果需要可以手动引入 Vintage 引擎

  • Spring Boot 2.4 配置文件处理逻辑变更,注意阅读更新日志

  • Spring Boot 2.6 默认禁用 Bean 循环依赖,可以通过将 spring.main.allow-circular-references 设置为 true开启

  • Spring Boot 2.7 自动配置注册文件变更,spring.factories中的内容需要移动至META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports文件下

  • spring-boot-properties-migrator可以识别弃用的属性,可以考虑使用

  • Spring Framework 5.2 需要 Jackson 2.9.7+,注意阅读更新日志

  • Spring Framework 5.2 注解检索算法重构,所有自定义注释都必须使用 @Retention(RetentionPolicy.RUNTIME) 进行注释,以便 Spring 能够找到它们

  • Spring Framework 5.3 修改了很多东西,但都与我们的应用无关,请关注更新日志

  • ASM 仅单元测试 Mock 在使用,无需特殊关注,做好 JUnit 升级兼容即可

  • CGLIB 大版本升级以兼容字节码版本为主,关注好变更日志即可

  • Lombok 即使是小版本升级,也会有破坏性更新,需要仔细阅读每个版本的更新日志,建议少用 Lombok

  • Hibernate 没有太大的破坏性更新,关注好变更日志即可

  • JUnit 升级主要关注大版本变更,如 4 升 5,小版本没有特别大的破坏性更新,并且是单元测试使用的依赖,可以放心升级或者不升级

  • Jackson 2.11,对 java.util.Date 和 java.util.Calendar 默认格式进行了更改,注意查看更新日志进行兼容

  • 注意字节码增强相关依赖的升级

  • 注意本地缓存升级

  • 注意 Netty 升级,关注更新日志

升级内部中间件

内部中间件升级较为简单,主要是关注 JMQ、JSF 版本。其中 JSF 依

首页 上一页 1 2 3 4 5 下一页 尾页 2/5/5
】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
上一篇Nacos源码 (3) 注册中心 下一篇你们的优雅停机真的优雅吗?

最新文章

热门文章

Hot 文章

Python

C 语言

C++基础

大数据基础

linux编程基础

C/C++面试题目