SpringbootWeb应用Java8升级到Java17全过程记录

  |   0 评论   |   0 浏览

简介

  Java17是java最近一个长期支持的版本,而且免费,连老詹(Java之父詹姆斯·高斯林)都推荐使用Java17,传说17版本是有史以来最快的版本,马上提高了兴趣,决定先把个人的web应用升级一下,先把坑趟一下,没问题了再升级企业应用。本次升级主要是基于Java8+springboot2.3.x的web应用程序,要升级java版本,还需要升级springboot的版本至最新版2.7.5,话不多说,直接开干(个人项目较简单,不涉及太多JVM启动参数,这里不便讨论)。
  开发环境:
  Java:1.8.0_181 -> 17.0.5
  Springboot:2.3.12.RELEASE -> 2.7.5
  IDE:Spring的STS4.16.1。
  

一、调整项目java版本,升级pom文件springboot的版本

1598230689563512832.png

1598230645376520192.png

1598230792655310848.png

  1、“The package javax.xml.parsers is accessible from more than one module: , java.xml”异常,原因是java9之后的新功能module-info.java造成出现上面的异常。
  在STS中按ctrl+shift+T,输入报错的类名,如SAXParser,就会出现含有对应依赖的jar包,把这个jar包从maven中exclude掉即可。
1598231474154213376.png
  去掉有冲突的依赖,编译问题搞定,执行也没有问题。

  2、对整个项目做一个依赖分析

jdeps --jdk-internals --multi-release 17 --class-path . mystery-3.0.0.jar

1598231130670075904.png

  本地项目没有找到依赖,如果有的话,要检查是否有废弃的api接口,如果有就要对其进行升级操作。

  3、启动应用程序,一步步排查异常:
  (1)出现spring bean循环注入异常:

The dependencies of some of the beans in the application context form a cycle:
┌──->──┐
|  com.github.pagehelper.autoconfigure.PageHelperAutoConfiguration
└──<-──┘
Action:
Relying upon circular references is discouraged and they are prohibited by default. Update your application to remove the dependency cycle between beans. As a last resort, it may be possible to break the cycle automatically by setting spring.main.allow-circular-references to true.

  高版本的springboot默认不允许bean的循环注入,因此需要在application配置文件中加入开启功能:

spring:
  main:
    allow-circular-references: true  #允许bean循环注入

  (2)出现Quartz定时任务启动异常
  经查阅,这个异常是在springboot2.5.7之后引入的,解决方案就是不配置org.quartz.jobStore.class,系统默认使用org.springframework.scheduling.quartz.LocalDataSourceJobStore。
  以上问题处理完毕后,启动应用程序,无异常,待后续运行看是否稳定。


标题:SpringbootWeb应用Java8升级到Java17全过程记录
作者:michael
地址:https://blog.junxworks.cn/articles/2022/11/14/1668397340791.html