当前位置: 首页 > news >正文

记录jdk8->jdk17 遇到的坑和解决方案

最近项目在升级jdk8->jdk17

springboot2->springboot3

顺序先升级业务服务,后升级组件服务。跟随迭代开发一起验证功能。

1.  使用parent pom 版本管理 spring相关组件的版本。 组件依赖低版本parent不变。

业务服务依赖高版本parent。

2. 修改maven jdk17 编译

<artifactId>maven-compiler-plugin</artifactId>

<properties>

<maven.compiler.source>17</maven.compiler.source>

<maven.compiler.target>17</maven.compiler.target>

<java.version>17</java.version>

<org.mapstruct.version>1.5.5.Final</org.mapstruct.version>

</properties>

3. security 

        1)新架构差异:新的 OAuth2 授权服务器采用完全不同的模块 ,删掉废弃spring-security-oauth2 引用spring-security-oauth2-client,spring-security-oauth2-authorization-server 

        2)改造security 中安全配置方法,支持spring security 6

ResourceServerConfigurerAdapter 类已经被移除,改用新的配置方式
@Bean
public SecurityFilterChain securityFilterChain(HttpSecurity http) throws Exception {http.authorizeHttpRequests(authz -> {oAuth2Config.getMapping().forEach((key, value) -> {String[] urls = value.toArray(String[]::new);authz.requestMatchers(urls).access((authentication, context) -> {if (authentication instanceof OAuth2AuthenticationToken oAuth2Authentication) {boolean hasScope = oAuth2Authentication.getAuthorities().stream().anyMatch(grantedAuthority -> grantedAuthority.getAuthority().equals("SCOPE_" + key));return new AuthorizationDecision(hasScope);}return new AuthorizationDecision(false);});});authz.requestMatchers("/oauth/token", "/oauth2/**", "/nano/**", "/test/**").permitAll();}).csrf(AbstractHttpConfigurer::disable);return http.build();
}

        3)旧框架已废弃:AuthorizationServerConfigurerAdapter 在 Spring Security 5.3+ 已废弃,Spring Security 6 完全移除

4.MybatisDynamicSqlInterceptor 删掉继承AbstractSqlParserHandler
- 适配MyBatis-Plus 3.5+版本
- 支持Spring Boot 3的依赖管理

5.HandlerInterceptorAdapter 改为实现 HandlerInterceptor 接口

6.import javax.annotation.Resource 改为import jakarta.annotation.Resource

7.MybatisPlusConfig 适配新3.5.0+

@Bean
public ConfigurationCustomizer configurationCustomizer() {return configuration -> {// 新版本已废弃 useDeprecatedExecutor 配置// 其他自定义配置可以放在这里};
}

8.javax.servlet 替换 jakarta.servlet

9.nacos1 升级到nacos2,部署nacos2服务端。要不会有兼容问题,同时要修改应用编排支持jdk17启动和nacos配置。

- env:- name: DEPLOY_ENVvalue: xxx- name: NACOS_SERVER_URLvalue: xxx- name: NACOS_NAMESPACEvalue: xxx- name: NACOS_GROUPvalue: xxx- name: NACOS_ENABLEvalue: "true"- name: SPRING_DISCOVERY_ENABLEvalue: "false"- name: OPEN_SQLvalue: open- name: JVM_OPTSvalue: -Xms512m -Xmx512m -XX:-OmitStackTraceInFastThrow -XX:+UseCountedLoopSafepoints-XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=/root/startup -Xlog:async-Xlog:gc*:file=/alidata1/admin/gc%t.log:utctime,level,tags:filecount=10,filesize=10M--add-opens java.base/java.lang=ALL-UNNAMED --add-opens=java.base/java.io=ALL-UNNAMED- name: NACOS_PWDvalue: xxx- name: NACOS_USERvalue: xxx- name: SPECIFIED_JAVA_HOMEvalue: /opt/amazon-corretto-17.0.6.10.1-linux-x64- name: JAVA_OPTSvalue: -Dloader.path=./plugins -Djava.security.egd=file:/dev/./urandom -Djava.awt.headless=true

10.由于网关服务还没有升级jdk17, 而且nacos已经分为了高版本和低版本两个所以通过nacos服务发现方式转发路由已经不适用,单独采用了url链接方式。 其他服务还是使用serverid方式。

zuul:routes:xxx:path: /xxx/**#serviceId: xxxxurl: xxx

相关文章:

  • 跨浏览器书签同步方案:WebDAV + Floccus插件实操指南
  • Redis 的不同数据结构分别适用于哪些微服务场景
  • vue3+vite 多个环境配置
  • 零浪费,最高效率:通往0%废品率的道路
  • 入门-C编程基础部分:6、常量
  • STM32启动流程详解
  • 【JVM优化】Minor GC的频率高的原因
  • element-ui自定义主题
  • C++23 中的可选扩展浮点类型:std::float{16|32|64|128}_t 和 std::bfloat16_t
  • ✅ MySQL 事务 MVCC ROLLBACK
  • Lua 第6部分 函数
  • 金融的未来
  • Hyperlane 是一款专为 Rust 构建的高性能 HTTP 服务框架
  • GitLab本地安装指南
  • Web Worker在uniapp鸿蒙APP中的深度应用
  • 【区块链通用服务平台及组件】全国产金融级区块链一体机 | FISCO BCOS 应用案例
  • React 18/19 使用Ant Design全局弹窗message
  • 【python】django sqlite版本过低怎么办
  • RTDETR融合[CVPR2025]BHViT中的token_mixer模块
  • 从 PyTorch 到 ONNX:深度学习模型导出全解析
  • 黑彩网站怎么做/市场调研报告范文2000
  • 怎么提高网站建设水平/网站优化公司推荐
  • 工业设计专业最佳出路/搜索引擎推广与优化
  • 学校网站建立/seoul是什么国家
  • 物联网工程就业前景/360优化大师官方版
  • 做系统那个网站好/百度页面推广